如何防止 "duplicate" 事件在 jQuery 中触发?
How do I prevent "duplicate" events from firing in jQuery?
我有一个连接到各种事件的事件处理程序,以确保它在各种情况下都被触发。
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, function() {
console.log("Event fired.");
});
您会注意到,定期与 <input type="text" id="myTextbox" />
交互(单击、轻敲、聚焦等)实际上会导致事件被触发多次。如果 运行 的代码变得非常大,那么这可能会影响性能。有什么方法可以防止事件被多次触发而不必删除大量事件类型吗?
根据文档:http://api.jquery.com/event.stopimmediatepropagation/
如果您的函数以调用结束
event.stopImmediatePropagation();
一个人被处决后,其他人就不会开枪了。
一种选择是限制(或去抖动)呼叫,这样您每个时间段只能接到一个呼叫。一个简单的实现如下(但是,可以找到更好的实现here)
function debounce(fn,time){
var timerId = null;
return function(e){
if(timerId)
return;
timerId = setTimeout(function(){
fn(e);
timerId = null;
},time);
}
}
用法为
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, debounce(function(e) {
console.log("Event fired.");
},300));
如您所见,此示例将使您的事件处理函数不超过每 300 毫秒发生一次。这是限制密集函数执行频率的好方法。
下面是一个实际的例子
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, debounce(function(e) {
console.log("Event fired.");
},300));
function debounce(fn,time){
var timerId = null;
return function(e){
if(timerId)
return;
timerId = setTimeout(function(){
fn(e);
timerId = null;
},time);
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="myTextbox" />
我有一个连接到各种事件的事件处理程序,以确保它在各种情况下都被触发。
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, function() {
console.log("Event fired.");
});
您会注意到,定期与 <input type="text" id="myTextbox" />
交互(单击、轻敲、聚焦等)实际上会导致事件被触发多次。如果 运行 的代码变得非常大,那么这可能会影响性能。有什么方法可以防止事件被多次触发而不必删除大量事件类型吗?
根据文档:http://api.jquery.com/event.stopimmediatepropagation/
如果您的函数以调用结束
event.stopImmediatePropagation();
一个人被处决后,其他人就不会开枪了。
一种选择是限制(或去抖动)呼叫,这样您每个时间段只能接到一个呼叫。一个简单的实现如下(但是,可以找到更好的实现here)
function debounce(fn,time){
var timerId = null;
return function(e){
if(timerId)
return;
timerId = setTimeout(function(){
fn(e);
timerId = null;
},time);
}
}
用法为
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, debounce(function(e) {
console.log("Event fired.");
},300));
如您所见,此示例将使您的事件处理函数不超过每 300 毫秒发生一次。这是限制密集函数执行频率的好方法。
下面是一个实际的例子
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, debounce(function(e) {
console.log("Event fired.");
},300));
function debounce(fn,time){
var timerId = null;
return function(e){
if(timerId)
return;
timerId = setTimeout(function(){
fn(e);
timerId = null;
},time);
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="myTextbox" />