0

我有一个连接到各种事件的事件处理程序,以确保它在各种情况下被触发。

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" />(单击、点击、聚焦等)实际上会导致事件被多次触发。如果正在运行的代码变得非常大,那么这可能会损害性能。我有什么办法可以防止事件被触发这么多次,而不必删除我的大量事件类型?

4

2 回答 2

4

一种选择是限制(或去抖动)呼叫,以便每个时间段仅发生一次呼叫。一个简单的实现如下(但是,可以在这里找到更好的实现)

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" />

于 2015-11-03T15:38:40.887 回答
3

根据文档:http ://api.jquery.com/event.stopimmediatepropagation/

如果您的函数在 event.stopImmediatePropagation(); 执行一个函数后立即调用,则其他函数将不会触发。

于 2015-11-03T15:28:37.163 回答