一个页面上有多个jQuery事件监听器
Multiple jQuery Event Listeners on a page
我想学习如何编写更好的jQuery代码,更整洁,更可扩展。为了方便起见,大多数教程总是使用理想的案例场景。
其中一种情况是页面上的事件侦听器。用户与页面交互的次数越多,这些侦听器就越多,这可能会导致问题,因此在本例中
JS
/* Adding list item (Click of Button) */
$(document.body).on('click','#submit-item',function(e) {
var buttonText = $(this).attr('value');
if(buttonText == 'Add Item') {
var productName = $(this).siblings('.form-group').children('input[name="product_name"]').val();
var productDesc = $(this).siblings('.form-group').children('textarea[name="product_description"]').val();
$('.list-group-items').append('<li class="list-group-item">' + productName + '<span class="hidden-product-desc">' + productDesc + '</span><span class="glyphicon glyphicon-remove pull-right" aria-hidden="true"></span> <span class="glyphicon glyphicon-edit pull-right" aria-hidden="true"></span><input type="hidden" name="select_products[]" value="'+ productName +'|'+ productDesc +'"/></li>');
$('.product_form').slideUp();
alert('Item added!');
buttonText = '';
productName = '';
productDesc = '';
}
e.stopPropagation();
e.preventDefault();
});
上面的代码监听按钮上的单击事件,并向列表中添加一个项目。这第一次工作很好。如果用户添加了另一个项目并单击按钮,那么它将添加该项目两次,以此类推。第十次点击将导致10个相同的项目被添加到列表中。
我已经做了什么:
e.stopPropagation();
e.preventDefault();
我认为这些可以防止这个问题。
我还尝试在目标后添加"。off()",如下所示:
$(document.body).off().on('click','#submit-item',function(e) {
// code here
});
然而,这破坏了我构建的每个项目的编辑和删除功能。我想知道是否有一种普遍的做法是用来解决这个问题的
为什么不把点击事件分配给你想要点击的BTN呢?
$(".buyItembtn").on("click", function(event){
//do something
event.stopPropagation();
event.preventDefault();
})
$(".removeItemBtn").on("click", function(event){
//do something
event.stopPropagation();
event.preventDefault();
})
alt:
$("#submit-item .buyItembtn").on("click", function(event){
//do something
event.stopPropagation();
event.preventDefault();
})
$("#submit-item .removeItemBtn").on("click", function(event){
//do something
event.stopPropagation();
event.preventDefault();
})
我认为正确的代码是:
$( document.body).on( "click",'#submit-item', function( event ) {
// code here
$( this ).off( event );
});
您可以使用事件命名空间并添加/删除特定的侦听器。
$( "p" ).on( "test.something", function( event ) {
alert( event.namespace );
});
https://api.jquery.com/event.namespace/相关文章:
- 在创建对象后附加一个jquery事件
- 将jQuery事件应用于所有类元素
- Jquery事件处理程序仅适用于匿名函数
- 如何在jQuery事件处理程序中存储和重用超时
- 无线电输入更改的jQuery事件未启动
- 我应该/如何清除mousemove JQuery事件侦听器
- 是否可以在jQuery事件中更改Angular范围
- jQuery事件侦听器多次启动
- jQuery 事件处理程序堆叠
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器
- 一个接一个地触发jQuery事件
- 在JQuery事件中查找父元素
- 堆叠jQuery事件(动画)
- 在jquery事件中引用javascript对象
- 动态添加对象的jQuery事件处理程序
- jQuery事件命名空间是否可以包含破折号
- Jquery事件绑定获胜'当作为方法调用时不起作用,但当直接在控制台中调用时会起作用
- 没有为Ajax添加的新元素注册Jquery事件
- 动态创建的DOM元素上的jQuery事件绑定
- jQuery事件未在动态生成的内容上激发