【问题标题】:last button of dynamic list not always firing click event with jQuery动态列表的最后一个按钮并不总是使用 jQuery 触发点击事件
【发布时间】:2013-06-25 05:26:30
【问题描述】:

我有一个简单的 div,我动态地将按钮附加到其中,现在除了列表中的最后一个元素之外,所有按钮单击事件都会触发,有时它会触发,有时它不会触发。如果我单击按钮中的左侧或右侧图标,它就可以正常工作,如果我单击按钮的文本或中间,有时它会触发,有时它不会触发。

<div id="btn-list"></div>

在加载我的 dom 后的页面加载时,我会附加随机数量的按钮,并将 on click 事件侦听器添加到按钮。

$( function () {
  for (var i=0;i<arr.length;i++) {
    var item = arr[i];
    var btn = $(document.createElement('button'));
     btn.text(item['description']);
     btn.attr('id', i);
     $("#btn-list").append(btn);
  }

  $('#btn-list').on('click', 'button', function (e) {
    e.preventDefault();
    e.stopPropagation();
    window.location.replace('blah.html');
  });
}

我正在使用 jQuery 2.0。

【问题讨论】:

  • 应该总是工作...在控制台中看到任何错误?你能做一个小提琴来重现这个问题吗?
  • 抱歉,我修正了错别字

标签: javascript


【解决方案1】:

如果没有额外的代码,这个 sn-p 应该不会失败。请记住,对添加的最后一个按钮的引用保存在 btn 中,因此如果在代码的其他部分修改了元素或其事件,它将改变预期的行为。

您是否添加了一些调试输出以确认未触发点击事件? http://jsfiddle.net/AstDerek/gKJNe/

$('#btn-list').on('click', 'button', function (e) {
    e.preventDefault();
    e.stopPropagation();
    alert('blah.html');
})

添加了一个简单的测试,在我测试的浏览器上没有失败,可能是受限于你的浏览器? http://jsfiddle.net/AstDerek/gKJNe/1/

现在,如果将按钮创建封装到它自己的函数中会发生什么?

function create_button (index,properties) {
    var btn = $(document.createElement('button'));

    btn.text(properties.description);
    btn.attr('id',index);
    $("#btn-list").append(btn);

    return btn;
}

for (var i=0;i<arr.length;i++) {
    create_button(i,arr[i]);
}

最后,作为一种解决方法,为什么不添加一个隐藏按钮作为最后一步?

for (var i=0;i<arr.length;i++) {
    create_button(i,arr[i]);
}

create_button(-1,{description:''}).hide();

【讨论】:

  • 是的,我什至添加了一个警报,并适用于除最后一个按钮之外的所有按钮,有时它有时不会发出警报。
  • CSS 也会影响事件吗?喜欢 webkit-transition?
  • 我不这么认为,但浏览器/机器性能可能会影响事件
  • 对我来说听起来像是一个电话间隙错误
  • 哇,我注意到唯一一次我的按钮不触发点击事件是当我点击可滚动 div 中最后一个元素上的按钮的文本部分时,如果我点击周围的任何地方文本部分一直有效。
猜你喜欢
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2016-04-02
  • 1970-01-01
  • 2018-11-13
  • 2012-08-18
  • 1970-01-01
相关资源
最近更新 更多