2009-09-28 84 views
11

我想弄清楚如何在jQuery的click()事件中創建的函數中存儲外部變量值。以下是我現在使用的代碼示例。如何在jQuery點擊函數中存儲局部變量?

for(var i=0; i<3; i++){ 
    $('#tmpid'+i).click(function(){ 
     var gid = i; 
     alert(gid); 
    }); 
} 

<div id="tmpid0">1al</div> 
<div id="tmpid1">asd</div> 
<div id="tmpid2">qwe</div> 

那麼是什麼情況是,事件被正確連接,但「GID」的價值永遠是「我」的最後一個遞增的值。我不知道如何在這種情況下設置私有變量。

回答

22

您可以創建閉包並將i賦值給閉包的局部變量。 gid變量將在創建閉包的時候被賦值爲i,而不是在函數運行時。

for(var i=0; i<3; i++){ 
    (function() { 
     var gid = i; 
     $('#tmpid'+i).click(function(){ 
      alert(gid); 
     }); 
    })(); 
} 
+0

這確實對我有用。它是一個有趣的匿名函數。 – Geuis 2009-09-28 07:19:38

+0

是嗎?我對Javascript相當陌生,但是我的Greasemonkey腳本有很多JQuery循環,這似乎是處理函數的一種自然方式 – 2009-09-28 07:22:42

+0

謝謝。我以前見過這種模式,第一次我碰到它是多麼有用。 – 2013-06-16 23:10:52

1

您已經創建了一個閉包,變量「i」在多個點擊處理程序之間共享。

由於JavaScript沒有塊作用域,你需要通過「我」到一個新的功能,所以它被複制按值到一個新的實例:

function bindStuff(i) { 
    $('#tmpid'+i).click(function(e){ 
        var gid = i; 
        alert(gid); 
      }); 
} 

for(var i=0; i<3; i++){ bindStuff(i); } 

這裏的另一個類似的問題: JavaScript closure inside loops – simple practical example

+0

出於某種原因,我無法爲我完成這項工作。我仍然遇到最初的問題。 – Geuis 2009-09-28 07:18:43

+0

OMG,我真的誤解了Javascript範圍。它沒有塊範圍。我已經編輯了我的答案,但您可以肯定地使用data()方法 - 這是傳遞數據的更好方法。 – 2009-09-28 08:10:40

0

我回顧了jQuery的原生data()方法。我實現了這一點,它也可以工作。它隱藏了關閉如何處理的一些實際功能,但它的實現簡單且相當乾淨。

2
for(var i=0; i<3; i++){ 
    $('#tmpid'+i).click((function(gid){ 
     return function(){ 
      alert(gid); 
     } 
    })(i)); 
} 

有很多方法可以做到這一點,這個工程,看起來很容易。

編輯

另一種方式:

for(var i=0; i<3; i++){ 
    $('#tmpid'+i).click([i],function(e){ 
     alert(e.data[0]); 
    }); 
1

或者,點擊(或綁定)的jQuery的第一個參數是被附加到事件作爲數據的對象。

for(var i=0; i<3; i++){ 
    $('#tmpid'+i).click({gid : i}, function(e) { 
     alert(e.data.gid); 
    }); 
} 

我覺得這比封閉式解決方案更易讀,但這歸功於品味。