2015-05-12 93 views
0

我以動態方式上單擊事件創建按鈕的方式如下:在一個循環中添加事件偵聽器與參數

//add button 
for(i=1;i<=narrow+1;i++){ 
    var btn = document.createElement("BUTTON"); 
    btn.id="element"+i; 
    var t = document.createTextNode("3D View"); 
    btn.appendChild(t); 
    btn.style.position="absolute"; 
    btn.style.top="520px"; 
    btn.style.left=100+120*(i-1)+"px"; 
btn.addEventListener('click', function(){window.alert(i-1+" "+nmol[i-1]);}); 

創建的按鈕都不錯,但在的addEventListener事件的函數的參數似乎沒有完全可以增加。當我打印我留下價值1.

任何人都可以解釋我爲什麼?

感謝

+1

另見http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –

+0

https://developer.mozilla.org/en -US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake –

回答

1

修改它,以便有循環

(function(index){ 
    btn.addEventListener('click', function(){window.alert(index-1+" "+nmol[index-1]);}); 
} 
)(i); 

發生了什麼事是i是全球性的循環,並通過一次點擊事件被觸發,i是內內關閉上次迭代的值。

但是,當您將一個函數括在括號中時,您正在有效地進行閉包,從而將變量的範圍縮小到括號內。

看到它的工作here

+0

我仍然只有索引的最後一個值,或者我顯示所有按鈕。 – Laetis

+0

@Laetis,你可以在小提琴中重現它,所以我可以更好地幫助你嗎? – AmmarCSE

+0

我試過了,但我對這個工具不太友善,但是所有的代碼都是:https://jsfiddle.net/Ly5n9jjd/ – Laetis

相關問題