jquery循环保持最后一个值

时间:2013-08-06 19:02:46

标签: jquery loops closures

我想在click事件中处理带有编号ID的div:

$(function() { 
    for (var i = 1; i != 10; ++i) {
       $("#div" + i).live('click', function () {
           //...
           console.log(i); // always prints 10
       });
    }
});

// html
<div id="div1">...</div>
<div id="div2">...</div>
etc.

我原以为每个div上的click事件都会触发自己的事件处理程序。但事实并非如此。

请修理。

4 个答案:

答案 0 :(得分:1)

使用闭包:

$(function () {
    for (var i = 1; i < 11; i++) {
        (function (i) {
            $("#div" + i).live('click', function () {
                //...
                console.log(i); // always prints 10
            });
        }(i));
    }
});

但是根据你的jquery版本,你可以使用as.on()(委托)或.delegate()方法作为选择器:'[id^=div]'

答案 1 :(得分:0)

for (var i = 1; i != 10; ++i)

for (var i = 1; i != 10; i++)

答案 2 :(得分:0)

循环保持最后一个值,因为在循环结束后调用live事件。您需要将值传递给循环中的live事件,如下所示:

$(function() { 
    for (var i = 1; i != 10; ++i) {
        $("#div" + i).live('click', {i: i}, function (e) {
            //...
            console.log(e.data.i); // prints correct value
        });
    }
});

答案 3 :(得分:0)

$(function() { 
    $("div[id^=div]").click( function(){
        var id = $(this).attr('id').replace('div', '');
        console.log(id);
    });
});

我发现这种检查点击的方式更加紧凑和简单,这也是一个有效的fiddle,虽然已经有答案为什么你的i变量坚持所以随意使用哪种方法似乎合适。