0

我真的不知道我发生了什么事。。

代码如下:

for (var j=0; j<tours.length; j++){
    var name = tours[j].name;

    var $tourLI = $('<li id="'+name+'"></li>');
    var $tourButton = $('<div class="button-inside"><span>'+name+'</span><span></span></div>');

    $tourButton.click(function() {
        alert(name);
    }
}

我正在尝试为每个显示游览名称的按钮绑定单击事件,但无论我单击哪个按钮,总是显示最后一个游览名称。

我究竟做错了什么?

谢谢!

4

4 回答 4

1

您需要将点击处理程序包装在一个闭包中,以便name在 for 循环继续之前“关闭”变量的值。

这是因为处理程序在您单击它之前实际上并未执行,因此它只会使用当时的当前值name(无论循环中的最后一个值是什么)。

for (var j=0; j<tours.length; j++){
    var name = tours[j].name;

    var $tourLI = $('<li id="'+name+'"></li>');
    var $tourButton = $('<div class="button-inside"><span>'+name+'</span><span></span></div>');

    (function(n) {
        $tourButton.click(function() {
            alert(n);
        });
    })(name)
}
于 2013-02-13T13:39:21.673 回答
0

当点击被触发j时会有值tours.length。您可以通过闭包锁定循环值以及其余变量。

for (var j=0; j<tours.length; j++){
  (function(){ 
    var currentJValue = j;
    var name = tours[currentJValue].name;

    var $tourLI = $('<li id="'+name+'"></li>');
    var $tourButton = $('<div class="button-inside"><span>'+name+'</span><span></span></div>');

    $tourButton.click(function() {
        alert(name);
    }
  })();
}
于 2013-02-13T13:38:34.407 回答
0

无需在循环内调用点击事件..附加动态创建的按钮并在循环外调用它并在委托事件上使用

试试这个

 $(document).on('click','div.button-inside',function() {
    alert($(this).text());
}

如果您想了解有关委托事件的更多信息,可以通过链接...

于 2013-02-13T13:39:08.593 回答
0

试试这个...

$('.div.button-inside ').on('click',function() {
    alert($(this).text());
}
于 2013-02-13T13:42:18.630 回答