2009-11-14 72 views
3

可能重複:
Passing values to onclick封閉在Javascript

我有IDS divNum0,...,divNum99 100元。每次點擊時應使用正確的參數調用doTask

不幸的是,下面的代碼並不關閉我,因此doTask對於所有元素都用100來調用。

function doTask(x) {alert(x);} 

for (var i=0; i<100; ++i) { 
    document.getElementById('divNum'+i).addEventListener('click',function() {doTask(i);},false); 
} 

有什麼方法我可以調用正確的參數功能?

+0

如果你不需要添加多個事件監聽器,你應該分配給'onclick',因爲這可以跨瀏覽器 – Christoph 2009-11-14 16:52:24

+0

我也建議考慮使用事件委託,並把單擊處理程序只是爲了父元素。點擊事件觸發時,您只需檢查目標並執行所需的功能。 – 2009-11-14 18:54:40

回答

2

創建經由文字自動執行的功能的封閉件(或命名工廠功能)

function doTask(x) { alert(x); } 

for(var i = 100; i--;) { 
    document.getElementById('divNum' + i).onclick = (function(i) { 
     return function() { doTask(i); }; 
    })(i); 
} 

,或者使用用於信息存儲的DOM節點

function doTask() { alert(this.x); } 

for(var i = 100; i--;) { 
    var node = document.getElementById('divNum' + i); 
    node.x = i; 
    node.onclick = doTask; 
} 

後者更多的內存友好因爲沒有多餘的函數對象被創建。

+0

注意:[立即調用的函數表達式](https://en.m.wikipedia.org/wiki/Immediately-invoked_function_expression)更精確:) – 2017-01-18 09:48:28

3

雖然(正確的)答案是the duplicate,但我想指出一個更高級的方法 - 用迭代器替換循環,這有效地解決了javascript「遲到」閉包問題。

loop = function(start, end, step, body) { 
    for(var i = start; i != end; i += step) 
     body(i) 
} 

loop(1, 100, 1, function(i) { 
    // your binding stuff 
})