admin管理员组文章数量:1391981
I have an event handler wired to a variety of events to ensure that it gets fired under a variety of circumstances.
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, function() {
console.log("Event fired.");
});
You'll notice that interacting regularly with <input type="text" id="myTextbox" />
(clicking, tapping, focusing, etc.) will actually cause the event to be fired multiple times. If the code being run bees very large, then this could hurt performance. Is there any way for me to prevent the event from being fired so many times without having to remove a ton of my event types?
I have an event handler wired to a variety of events to ensure that it gets fired under a variety of circumstances.
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, function() {
console.log("Event fired.");
});
You'll notice that interacting regularly with <input type="text" id="myTextbox" />
(clicking, tapping, focusing, etc.) will actually cause the event to be fired multiple times. If the code being run bees very large, then this could hurt performance. Is there any way for me to prevent the event from being fired so many times without having to remove a ton of my event types?
2 Answers
Reset to default 4One option is to throttle (or debounce) the calls, so that you only get one call occurring per time period. A simple implementation would be as below (however, a better implementation can be found here)
function debounce(fn,time){
var timerId = null;
return function(e){
if(timerId)
return;
timerId = setTimeout(function(){
fn(e);
timerId = null;
},time);
}
}
And usage would be
var allChangeEvents = "focus blur select change click dblclick mousedown mouseup keypress keydown keyup";
$("#myTextbox").on(allChangeEvents, debounce(function(e) {
console.log("Event fired.");
},300));
As you can see, this example would cause your event handling function to occur no more often than every 300ms. This is a good way to limit how often intensive functions are executed.
Below is a live example of this in action
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./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="myTextbox" />
According to the documentation: http://api.jquery./event.stopimmediatepropagation/
if your functions ends with a call to
event.stopImmediatePropagation();
as soon as one is executed the others wont fire.
本文标签: javascriptHow do I prevent quotduplicatequot events from firing in jQueryStack Overflow
版权声明:本文标题:javascript - How do I prevent "duplicate" events from firing in jQuery? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744704649a2620768.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论