2016-09-17 85 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);