我有一个简单的div,我动态地将按钮附加到,现在除了列表中的最后一个元素之外,所有按钮点击事件都会触发,有时候它会触发它。如果我单击按钮中的左侧或右侧图标就可以正常工作,如果我单击按钮的文本或中间,有时会触发,有时它不会触发。
<div id="btn-list"></div>
在我的dom加载后加载页面我附加了一个随机数量的按钮,然后我将点击事件监听器添加到按钮。
$( 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。
答案 0 :(得分:0)
如果没有额外的代码,这个代码段不应该失败。请记住,添加的最后一个按钮的引用保存在btn
中,因此如果在代码的其他部分修改了元素或其事件,它将改变预期的行为。
您是否添加了一些调试输出以确认未触发click事件? 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();