2010-10-14 47 views
4

我試圖在我傳入函數時顯示值爲'i'的「click()」函數。但是它在完成後返回'i'的價值。我畫一個空白如何獲得功能指的'i'值當我第一次傳遞的功能回顧javascript/jQuery的click()函數中的舊迭代器值(關閉問題)

for(var i=0; i<10; i++){ 
var ts = $('#<span></span>').clone().click(function(){ 
    alert(i); 
}); 
} 

注:

'#'不應該存在, '.clone()'

+0

+1用於正確推斷問題。 – SLaks 2010-10-14 02:31:40

+1

考慮將問題回滾到原始狀態。給出的答案在你改變問題時沒有多少意義。 :o) – user113716 2010-10-14 02:53:43

+0

@patrick dw - done – 2010-10-14 15:11:30

回答

4

像這樣將工作:

for(var i=0; i<10; i++){ 
    (function(j) { 
    var ts = $('<span></span>').click(function(){ 
     alert(j); 
    }); 
    })(i); 
} 

You can give it a try here。雖然,你的創作有點過時,但我不確定你爲什麼要創建一個新的元素來克隆它,並且在那裏還有一個額外的# ....我刪除了上述兩個,但它沒有不會影響內部函數的解決方案。

+0

這是正確的答案;將事件處理程序包裝在一個匿名函數中並傳遞它,我產生所需的閉包。 – 2010-10-14 02:42:10

+0

嘿,尼克,我想我讀了一些地方,jQuery保存一個元素,一旦你做到了,所以你必須克隆它,如果你想要一個新的。即使在記憶中我也很朦朧,所以這可能是錯誤的。 – 2010-10-14 15:13:32

+0

@DutrowLLC - 如果用來創建它的HTML字符串短於512字節,那麼它創建的文檔片段被緩存,但是*已經被克隆(爲了速度),所以你不需要做它你自己:) – 2010-10-14 15:21:52

2

您需要將循環體移動到一個單獨的函數,該函數以i作爲參數。

您可以使用正常的功能,如:

for(var i=0; i<10; i++) { 
    makeCopy(i); 
} 

function makeCopy(i) { 
    var ts = $('#<span></span>').clone().click(function(){ 
     alert(i); 
    }); 
} 

您還可以使用內聯方法,如:(小心混淆語法)

for(var i=0; i<10; i++) { 
    (function(i) { //Note i parameter 
     var ts = $('#<span></span>').clone().click(function(){ 
      alert(i); 
     }); 
     ... 
    })(i);   //Note i parameter 
} 
+0

你的第二種方法會在所有情況下提醒'10'。 – 2010-10-14 02:35:49

+0

@Nick:爲什麼? – SLaks 2010-10-14 02:37:01

+0

@SLaks - 因爲'i'仍然指向相同的外部變量,您可以在這裏測試它:http://jsfiddle.net/nick_craver/ruHjJ/1/您必須將'i'傳入函數才能獲取副本。 – 2010-10-14 02:38:01