2016-09-17 42 views
0

我有一个简单的脚本,用箭头键在屏幕上移动一个精灵。我想在一个名为$s的变量中包含对我的$('#sprite')的引用。但根据我声明和初始化$s,我得到一个工作功能或非工作功能。为什么是这样?不能改变jQuery对象变量。这是范围问题吗?

编辑:区别在于我声明和初始化$s。我不小心将相同的代码片段放入了两次,但现在已经修复。

这不起作用:

$(document).ready(main()); 
 

 
function main(){ 
 
\t 
 
\t var $s = $("#sprite"); 
 
\t var time = 'fast'; 
 
\t 
 
\t $(document).keydown(function(e){ 
 
// \t \t \t var $s = $("#sprite"); 
 
\t \t \t console.log($s); 
 
\t \t \t key = e.which 
 
\t \t \t switch(key){ 
 
\t \t \t \t case 37: //left 
 
\t \t \t \t \t $s.animate({left: "-=10px"}, time); 
 
\t \t \t \t \t console.log("left"); 
 
\t \t \t \t \t break; 
 
\t \t \t \t case 38: //up 
 
\t \t \t \t \t $s.animate({top: "-=10px"}, time) 
 
\t \t \t \t \t console.log("up"); 
 
\t \t \t \t \t break; 
 
\t \t \t \t case 39: //right 
 
\t \t \t \t \t $s.animate({left: "+=10px"}, time) 
 
\t \t \t \t \t console.log("right"); 
 
\t \t \t \t \t break; 
 
\t \t \t \t case 40: //down 
 
\t \t \t \t \t $s.animate({top: "+=10px"}, time) 
 
\t \t \t \t \t console.log("down"); 
 
\t \t \t \t \t break; 
 
\t \t \t \t default: 
 
\t \t \t \t \t break; 
 
\t \t \t } 
 
\t \t \t 
 
\t }); 
 
};

这工作:

$(document).ready(main()); 
 

 
function main(){ 
 
\t 
 
// \t var $s = $("#sprite"); 
 
\t var time = 'fast'; 
 
\t 
 
\t $(document).keydown(function(e){ 
 
\t \t \t var $s = $("#sprite"); 
 
\t \t \t console.log($s); 
 
\t \t \t key = e.which 
 
\t \t \t switch(key){ 
 
\t \t \t \t case 37: //left 
 
\t \t \t \t \t $s.animate({left: "-=10px"}, time); 
 
\t \t \t \t \t console.log("left"); 
 
\t \t \t \t \t break; 
 
\t \t \t \t case 38: //up 
 
\t \t \t \t \t $s.animate({top: "-=10px"}, time) 
 
\t \t \t \t \t console.log("up"); 
 
\t \t \t \t \t break; 
 
\t \t \t \t case 39: //right 
 
\t \t \t \t \t $s.animate({left: "+=10px"}, time) 
 
\t \t \t \t \t console.log("right"); 
 
\t \t \t \t \t break; 
 
\t \t \t \t case 40: //down 
 
\t \t \t \t \t $s.animate({top: "+=10px"}, time) 
 
\t \t \t \t \t console.log("down"); 
 
\t \t \t \t \t break; 
 
\t \t \t \t default: 
 
\t \t \t \t \t break; 
 
\t \t \t } 
 
\t \t \t 
 
\t }); 
 
};

+1

什么是两者之间的区别? – Scimonster

+0

您正在调用'main'。将引用传递给'.ready()',例如'.ready(main)' – guest271314

回答

2

的区别在于是否声明$s里面的keydown处理程序或外部?让我们来看看发生了什么,从一开始:

$(document).ready(main()); 

您呼叫的功能main,其返回值传递给$(document).ready()。这不是你想要做的。在这里,main立即执行。你想要的是:

$(document).ready(main); 

没有括号,路过一家参考的功能。

它为什么重要?

当您立即调用函数时,DOM尚未准备好,然后$s在外部函数中定义时没有值。但是当你将它设置在内部函数中时,$s不会被设置,直到你按下一个键,然后该元素才存在。

真的,任何一个人都应该工作。问题在于另一行代码。

+0

完美,这有效。谢谢! – Hivekeeper

0

两个代码都是相同的。

更改的第一行,但..

// $(document).ready(main()); 
    $(document).ready(main);