2013-08-26 32 views
2

以下代碼在<body id="container" />下創建10個元素。當我點擊任何元素時,我總是看到值爲10的警報。在Javascript關閉中捕獲計數器值

如何獲取每個警報以顯示每個元素的索引?

for (var i = 0; i < 10; ++i) { 
    var id = "#element_" + i; 
    $("#container").append('<p id="element_' + i + '">foo</p>'); 
    $(id).click(function (e) { 
    alert(i); 
    }); 
} 

回答

2

需要創建一個私有封閉

for (var i = 0; i < 10; ++i) { 
    (function(idx){ 
     var id = "#element_" + idx; 
     $("#container").append('<p id="element_' + idx + '">foo</p>'); 
     $(id).click(function (e) { 
      alert(idx); 
     }); 
    })(i) 
} 

演示:Plunker

+0

我們在SO在如何downvote的答案,只是因爲有人不喜歡的答案....改善,其中的[downvote(HTTP:// stackoverflow.com/help/privileges/vote-down)說:「每當你遇到一個極其潦草,沒有付出努力的帖子,或者一個明確而且可能危險不正確的答案時,請使用你的低評價。」 –

+0

不是我的失望。我剛剛積極投票,現在接受。完美的作品!謝謝:-) – necromancer

+0

不是我的dv,而是down-vote按鈕的標題說「這個答案沒用」:) –

4

你需要或者關閉或簡單地使用$.on()數據:

for (var i = 0; i < 10; ++i) { 
    var id = "#element_" + i; 
    $("#container").append('<p id="element_' + i + '">foo</p>'); 
    $(id).on("click", i, function (e) { alert(e.data); }); 
} 
+0

+1更好的解決方案 –

+0

或者,您可以在緩存'$('#container')'時首先執行'.on()',然後執行'.appendTo()'。 –

+0

+1,不確定哪一個接受..這一個是jQuery特定的,接受的是純javascript。 – necromancer

3

不要for環路內的功能

for (var i = 0; i < 10; ++i) { 
    $("#container").append('<p id="element_' + i + '">foo</p>'); 
} 

$("#container > p").click(function (e) { 
    var idNum = this.id.split('_')[1]; 
    alert(idNum); // 0, 1, 2 ... 
}); 

DEMO

+1

+1注意 – necromancer