8

我对 Jquery 中的 .click 函数有疑问。我有这个代码:

for (var i = 0; i < 5; i++) {
    var divTest = $('<div></div>');
    divTest.text("My Div " + i);
    divTest.click(function() {
        alert("Alert: Div " + i);
    });
    $('#myTest').append(divTest);
}​

我希望向“myTest”元素添加五个 div,并且对于每个 div,onclick 函数将显示一个带有相应 div 编号的警报。

div 已正确添加,但是当我单击 div 时,我总是会收到带有文本的警报:"Alert: Div 5"。为什么?我必须改变什么才能产生我期望的行为?

这是我的 jsFiddle:http: //jsfiddle.net/BKFGm/2/

4

6 回答 6

11

在这种情况下,您应该使用闭包

(function(i) {
    divTest.click(function() {
        alert("Div: " + i);
    });
})(i);

演示:http: //jsfiddle.net/BKFGm/4/


i另一种选择是传入eventData地图:

divTest.click({ i: i }, function(e) {
    alert("Div: " + e.data.i);
});

演示:http: //jsfiddle.net/BKFGm/11/

于 2012-10-16T22:03:39.803 回答
5

再一次,一个经典的闭包案例。i不断增加,而您想将其锚定在click事件中。试试这个:

for( i=0; i<5; i++) {
  (function(i) {
    // your code that depends on `i` here
  })(i);
}
于 2012-10-16T22:04:00.817 回答
0

这是一个范围问题。此外,这是一个非常常见的问题。

简单的修复:

for(var i = 0; i < 5; i++){
     var divTest = $('<div></div>')
         divTest .text("My Div " + i);

    (function(index){
        divTest .click(function () {
             alert("Div: " + index);
                    });
    })(i);

        $('#myTest').append(divTest);
}
于 2012-10-16T22:05:34.907 回答
0

发生这种Alert情况时,变量i已设置为5

于 2012-10-16T22:06:03.907 回答
0

.click在与您的循环不同的范围内工作,并且是undefined在执行单击处理程序时,除非您在全局范围内有其他 i 变量。

于 2012-10-16T22:07:14.810 回答
0

你也可以试试这个

$(function() {
    for(var i = 0; i < 5; i++){
        var divTest = $('<div/>', {
            'text':"My Div " + i,
            'click':(function(i){
                return function(){
                    alert("Div: " + i);
                }
            })(i)
        });
        $('#myTest').append(divTest);
    }
});​

演示

于 2012-10-16T22:13:34.693 回答