2016-05-11 51 views
1

我試圖將一個onchange事件附加到由js創建的複選框。關閉激活加載,而不是複選框更改

我終於得到了在for循環中工作的閉包,但現在它在加載時而不是在變化時激活。

這是爲什麼?

https://jsfiddle.net/dkrh587h/2/

chkbox.addEventListener("change", (function(newVarA, newVarB, newVarC, newVarD) { 
    searchMap(newVarA, newVarB, newVarC, newVarD); 
    }(gblStatus, "Status", statuser, chkbox.checked)), false); 

回答

2

這是因爲要調用的函數作爲第二個參數addEventListener與額外的括號傳遞。

這有時被稱爲一個self-executing功能:

function() { 
    // will get invoked immediately 
}(); 

變量,如statuser將在你的回調可用,因爲封閉的(假設他們的功能範圍的是「封閉」你貼的代碼中聲明)。

這樣的模式應該工作:

var statuser = 'my user'; // will be available in your callback 
chkbox.addEventListener("change", function() { 
    searchMap(gblStatus, "Status", statuser, chkbox.checked); 
}, false); 
+0

這是我的第一個問題。每當我嘗試時,我只得到for循環中的最後一個元素。 – Emwat

+0

@Emwat我明白了。這是一個經典的與閉包混淆的例子。我建議使用'gblStatus.forEach'來避免這個問題。看到這個答案的信息爲什麼發生這個問題:http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –