【问题标题】:basic jquery looping question around 'click'围绕“点击”的基本jQuery循环问题
【发布时间】:2011-06-10 19:17:06
【问题描述】:

基本问题,但我一直在敲我的头,所以想把它带到这里。

html 看起来像这样(编辑,修正了右引号)

<span class='deleteimage-119'>delete</span>
<span class='deleteimage-120'>delete</span>
<span class='deleteimage-121'>delete</span>
<span class='deleteimage-122'>delete</span>
<span class='deleteimage-123'>delete</span>

javascript/jquery 看起来像这样

iids = ['119','120','121','122','123'];
for (i=0; i<iids.length; i++) {
        place = iids[i];
        $(".deleteimage-" + place).click(function () {
                alert(place);
             });
    }

点击功能附加到每个单独的跨度,但点击后的警报只显示数组中的最后一项。

【问题讨论】:

  • 您忘记了spans 中的结束语。
  • 10% 的 Stackoverflow JavaScript 问题可能重复 :-)
  • 它们应该是双引号
  • @morgar ??我认为单引号完全可以,即使在严格的 XHTML 中也是如此。
  • @Mickey - 你的主要问题已经得到解答,只有几个一般性问题/指针:1)为什么每个跨度都有一个特定的类?你有每个特定的样式吗?如果不是,那么我认为您可能想要做的是让这些成为您的 id,而不是类。 2)您真的是要单步执行这个 id 列表,还是真的希望绑定到页面上每个跨度的点击?如果是后者,您可以省去 for 循环,为每个 span 赋予相同的类,如 'deleteimage',然后将它们全部绑定在一行中: $('.deleteimage').click(function() { alert $(this) .attr('id')});

标签: javascript jquery


【解决方案1】:

您有一个范围界定问题。到回调触发时,place 具有循环中的最后一个值。

你需要为闭包创建一个新变量;每次迭代一个变量,然后每个变量都将被闭包“捕获”并在回调中使用。

如果解决方案是这样就好了:

var iids = ['119','120','121','122','123']; // don't forget `var` please
for (var i=0; i<iids.length; i++) {
   var place = iids[i]; // local variable?
   $(".deleteimage-" + place).click(function () {
       alert(place);
   });
}

唉,Javascript 没有块作用域,所以这里仍然只有一个名为 place 的变量,它会随着循环的运行而不断更新。

所以,你必须使用一个函数来代替:

var iids = ['119','120','121','122','123'];

function f(place) {
   // NOW `place` is a local variable.
   $(".deleteimage-" + place).click(function () {
       alert(place);
   });
}

for (var i=0; i<iids.length; i++) {
   f(iids[i]);
}

有使用闭包和绑定变量来使用这种函数方法的更简洁的方法,其他答案很好地涵盖了这些更简洁的方法。我的回答侧重于解释问题。

【讨论】:

  • +1 用于使用这种方法而不是将函数放入返回另一个函数的循环中......
  • @Pointy:我的朋友,你已经不在Scheme壁橱里了
  • 感谢托马拉克!我有一种感觉,它正在做类似的事情,但只是不确定如何绕过它......因此我尝试创建那个局部变量。哦,感谢有关添加 var 的提醒 :)
【解决方案2】:

问题在于范围和闭包。 在 JS 中,作用域是@函数级别而不是块级别。

试试这个:

var iids = ['119','120','121','122','123']; 
for (i=0; i<iids.length; i++) {         
    place = iids[i];
    var clickFn = function(a){
        return function(){
         alert(a);
        }
    }(place);
    $(".deleteimage-" + place).click(clickFn );     
} 

【讨论】:

    【解决方案3】:

    这是因为点击是在循环完成后发生的,所以您正在提醒place = iids[iids.length - 1]。为了达到您正在寻找的结果,您需要创建一个函数闭包并将place 作为参数传递:

    iids = ['119', '120', '121', '122', '123'];
    for (i = 0; i < iids.length; i++) {
        place = iids[i];
        (function(_place) {
            $(".deleteimage-" + _place).click(function() {
                alert(_place);
            });
        } (place));
    }
    

    【讨论】:

      【解决方案4】:

      在循环内部,您将click 事件绑定到span,但这些事件仅在循环完成后才会触发。因此,它将始终显示最后一个值。

      【讨论】:

        【解决方案5】:

        正如其他人所提到的,您有一个范围界定问题。除非所有这些类都具有独特的含义,否则我会将 place 值移动到数据属性并将 deleteimage 保留为类名。比如:

        <span class='deleteimage' data-place='119'>delete</span>
        <span class='deleteimage' data-place='120'>delete</span>
        <span class='deleteimage' data-place='121'>delete</span>
        <span class='deleteimage' data-place='122'>delete</span>
        <span class='deleteimage' data-place='123'>delete</span>
        
        $(".deleteimage").click(function() {
            var place = $(this).data("place");
            alert(place);
        });
        

        如果 place 值不是唯一值,则此答案不适用。

        【讨论】:

        • 谢谢,这是一个非常好的解决方案,因为目前我在每个跨度周围都有一个名为“deleteimage”的父 div,我也应用了该样式。多余的,这就是我喜欢你的原因:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多