2013-08-30 98 views
3

HTML設置Javascript函數動態

<body> 
    <div id='test' onClick="load()"> 
     2 
    </div> 
</body> 

的Javascript

load = function() { 
    test.innerHTML = ""; 

    for (var i = 0; i < 5; i++) { 

     var p = document.createElement("p"); 
     p.innerHTML = "Link"; 

     p.onclick = function() { 
      alert("LINK NR: " + i) 
     } 

     document.getElementById('test').appendChild(p); 

    } 
} 

在上面的代碼,爲什麼函數總是返回最後value

Here is a fiddle代碼。

+2

'i'不是事件函數內固定,參見[使用Javascript瓶蓋內循環 - 簡單實用的例子] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

回答

1

試試這個:

(function(i){ 
     p.onclick = function() { 
      alert("LINK NR: " + i) 
     } 
    })(i); 

小提琴:http://jsfiddle.net/sFXep/2/

這裏的解釋是:http://en.wikipedia.org/wiki/Immediately-invoked_function_expression

在這裏:http://benalman.com/news/2010/11/immediately-invoked-function-expression/

+1

這不回答這個問題:爲什麼會發生? –

+0

@Kolink正確,但我的英語不太好,所以我會把它留給其他聰明的人=) – Cherniv

5

p.onclick功能只會被稱爲每當有是在元素上觸發的「點擊」事件,然後是值i會是5,因爲循環已經在那時完成了。

你在期待什麼函數語句會爲每個循環迭代執行 - 事實並非如此。如果它確實被執行,那麼對於每次迭代,您都會收到警報消息,而不管元素是否被點擊。

這可以通過保持console.log之外,在函數內部進行檢查,你會發現每個迭代console.log聲明外的函數將在瀏覽器的控制檯進行打印,但內部功能console.log聲明不會爲每個迭代執行的循環。

1
check this fiddle link i have made some small changes 

http://jsfiddle.net/sFXep/8/

+0

最好提供一些這些變化在答案中做的信息 - 以及,鏈接可以隨着時間的推移「爛」 ,留下這些無用的答案 - 參見[Meta Stack Overflow](http://meta.stackexchange.com/questions/84342/answer-that-only-contains-a-link-to-jsfiddle)。此外,「這種類型的東西」並不意味着突出顯示文本 - 您還可以使用引號,粗體,斜體文本和列表等其他方法來表達您的觀點。 –

1

一旦完全執行的局部變量i具有價值5for聲明。
而在所有創建的事件處理程序i一樣最終的i在for循環值