【问题标题】:JQuery binding in a loop [duplicate]循环中的JQuery绑定[重复]
【发布时间】:2013-03-13 20:25:18
【问题描述】:

我有一个循环

for (i = 0; i < 10; i++)
{
    outPut.innerHTML += "<div id='file" + i + "'>" + i + "</div>";
    $('#file' + i).on('click', function(event) {
        alert('User clicked on ' + i);
    }).css('cursor', 'pointer');
}

并且只有最后一个元素会附加事件。有什么问题?

在这里查看测试http://jsfiddle.net/haF7Y/

【问题讨论】:

标签: javascript jquery


【解决方案1】:

这就是您所缺少的 - 事件侦听器本质上是异步的!因此,在执行此类任务时,请始终在循环内使用闭包函数!见下文-

for (i = 0; i <10; i++){
  (function(i){
    outPut.innerHTML +="<div id='file"+ i + "'>" + i+ "</div>";
    $('#file' + i).on('click', function(event) {
      alert('User clicked on ' + i);
    }).css('cursor', 'pointer');
  }(i))
}

【讨论】:

    【解决方案2】:

    for loop中移除点击事件。

    $(document).on('click', '[id^=file]', function(e){
        alert('user clicked on '+ this.id.split('file')[1]);
    });
    

    【讨论】:

      【解决方案3】:

      使用这样的 jquery 对象(并创建一个闭包)

      var jOutPut = $('div:first');
      
      var create = function(i) {
          var j = $('<div/>')
              .attr('id', 'file' + i)
              .css('cursor', 'pointer')
              .html(i)
              .click(function(event){
                  alert('User clicked on ' + i);
              });
      
          jOutPut.append(j);
      }
      
      for(i=0;i<10;i++) {
          create(i);
      }
      

      【讨论】:

      • @Matt 再试一次...对不起
      • @Matt 和 @JanDvorak ... never post untested code ... 现在!
      • 如果我发布未经测试的代码来演示算法,我将其标记为:“类似于以下内容”,“这是解决方案的草图”......请注意,这不起作用当修复某人的代码时,稍后调试总是一个好主意:-)
      【解决方案4】:

      你的代码应该这样写:

      for (i = 0; i < 10; i++)
      {
          var newEl = $("<div class='file' data-index='"+i+"'>" + i + "</div>").css('cursor', 'pointer');
          outPut.append(newEl);
      }
      
      $('.file').click(function(event) {
              alert('User clicked on ' + $(this).attr('data-index'));
      });
      

      这是一个证明它有效的小提琴:http://jsfiddle.net/qX8RQ/

      【讨论】:

      • 已修改,抱歉我错过了“i”。所有该死的反对票是怎么回事?您应该感谢您的帮助。
      • 不确定index() 是不是最好的方法。在某些集合中建立索引可能会更好。
      • 投反对票通常表示答案实际上不正确或有害。你没有解决问题。因此,事实上是不正确的。
      • 显示索引的方法有很多种,如果您想要更明确的索引,请使用“data-index”或“data-___”来存储信息。
      • data-index 具有创新性。 +1 创意 :-)
      猜你喜欢
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2021-10-13
      • 2014-07-28
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      相关资源
      最近更新 更多