jQuery 有内置的方法吗?
不。
如果没有,在 vanilla JS 中执行此操作是否有比我在第二个 jsfiddle 示例中使用的更好的模式?
setTimeout
您可以跟踪上次调用处理程序的时间,并且仅在经过定义的时间间隔后才调用它,而不是使用和标志。这被称为节流,并且有多种方法可以实现这一点。
在最简单的形式中,您只需忽略在 的时间内进行的每个调用lastCall + interval
,以便在每个时间间隔内只发生一个调用。
例如,这是一个返回一个新函数的函数,该函数只能每 X 毫秒调用一次:
function throttle(func, interval) {
var lastCall = 0;
return function() {
var now = Date.now();
if (lastCall + interval < now) {
lastCall = now;
return func.apply(this, arguments);
}
};
}
您可以将其用作
$("#inputField").on("keypress", throttle(function(event) {
$("div#output").append("key pressed <br/>");
}, 500));
演示
正如Esailija在他的评论中提到的,也许你需要的不是节流,而是去抖动。这是一个类似但略有不同的概念。节流意味着每 x 毫秒应该只发生一次,而去抖动意味着只有在最后 x 毫秒内没有发生的情况下才会发生。
一个典型的例子就是scroll
事件。滚动事件处理程序将被非常频繁地调用,因为该事件基本上是连续触发的。但也许您只想在用户停止滚动时执行处理程序,而不是在他滚动时执行。
实现此目的的一种简单方法是使用超时并在再次调用该函数时取消它(并且超时尚未运行):
function debounce(func, interval) {
var lastCall = -1;
return function() {
clearTimeout(lastCall);
var args = arguments;
var self = this;
lastCall = setTimeout(function() {
func.apply(self, args);
}, interval);
};
}
此实现的一个缺点是您无法从事件处理程序(例如return false;
)返回值。也许有些实现可以保留此功能(如果需要)。
演示