Javascript jQuery/backbone.js-延迟函数调用
我有一个Javascript jQuery/backbone.js-延迟函数调用,javascript,jquery,backbone.js,dom-events,settimeout,Javascript,Jquery,Backbone.js,Dom Events,Settimeout,我有一个#search元素,当keyup事件发生时,它应该触发一个函数。仅当keyup在设定的时间内(例如500毫秒)未发生时,此函数才应启动。这将阻止搜索结果更新每个按下的字母。问题在于,对于backbone.js,我将事件放在散列中,适用的事件如下所示: 'keyup#search':'setSearch' 当发生keyup事件时,调用setSearch()函数。我现在还不太清楚该怎么处理。我尝试了各种方法,但是没有任何方法可以保持计时器超过函数结束时间 我有这样的想法: setSearch
#search
元素,当keyup
事件发生时,它应该触发一个函数。仅当keyup
在设定的时间内(例如500毫秒)未发生时,此函数才应启动。这将阻止搜索结果更新每个按下的字母。问题在于,对于backbone.js,我将事件放在散列中,适用的事件如下所示:
'keyup#search':'setSearch'
当发生keyup
事件时,调用setSearch()
函数。我现在还不太清楚该怎么处理。我尝试了各种方法,但是没有任何方法可以保持计时器超过函数结束时间
我有这样的想法:
setSearch: function(event) {
var timer = window.setTimeout( function() {
// run function here
alert('fired');
}, 500);
},
我将运行自己的函数,而不是
警报('fired')
。我可以理解为什么此代码不起作用(为发生的每个keyup
事件设置了计时器。但我仍然不清楚我还可以尝试什么。在视图中需要一个实例变量来存储计时器ID,然后可以根据需要停止并重新启动它:
setSearch: function(event) {
var self = this;
if(self.timer)
clearTimeout(self.timer);
self.timer = setTimeout(function() {
alert('fired');
self.timer = null;
}, 500);
}
因此,如果计时器已经在运行,您可以调用以停止它,启动一个新的计时器,并将计时器ID存储在
self.timer
(也称为this.timer
)。您还需要在计时器的回调函数中重置存储的计时器ID,否则您的setSearch
在其计时器触发一次后将不会执行任何操作。而所有self
业务只需捕获此,以便在计时器的回调函数中使用。因为您希望事件处理程序事件能够维护无论事件是否最近触发了
,您都可能希望将处理程序包装成一个闭包并保持该状态。当事件触发时,该状态应更改为true,并在500毫秒延迟后重置为false
setSearch: function( ) {
var firedRecently = false;
return function(event) {
if (firedRecently) {
// it has fired recently. Do you want to do something here?
} else {
// not fired recently
firedRecently = true;
// run your function here
alert('fired');
var resetStatus = window.setTimeout( function () {
firedRecently = false;
}, 500);
}
}
}( );
您所寻找的实际上是从underline.js(主干网的一个需求)提供给您的一个函数
简而言之,这将返回一种新形式的匿名函数,该函数只能每500毫秒调用一次。您可能需要根据需要调整时间
更多信息:
防止每次键控更新搜索结果
正是下划线的\uuBounce(函数,等待)
函数要处理的那种情况。状态:
创建并返回传递的函数的新取消公告版本
,该版本将推迟其执行,直到自上次调用该函数以来已过等待
毫秒。用于实现仅应在输入停止到达后发生的行为
重构后的代码看起来很简单,如下所示:
setSearch: function(event) {
_.debounce(doSomething, 300);
},
user1243645的评论:“我在我的项目中遇到了类似的需求。我只是想补充一点,作为对Skylar Anderson关于\.throttle
的帖子的回应,我发现它更适合我的需要。”对于这个问题,Debounce比throttle好得多。“它将推迟其执行,直到自上次调用它以来已过等待毫秒“-在“搜索字段”的情况下不起作用,因为您不希望它在第一个关键点上进行搜索,您希望在执行搜索之前等待3个关键点等-尤其是对于大型集合。但是如果发生火灾,请等待再次火灾,是的,这很好。”。
setSearch: function(event) {
_.debounce(doSomething, 300);
},