这是对我对requestAnimationFrame
. 我需要一个去抖动功能,因为每次调整窗口大小时我都会进行一些 DOM 交互,并且我不想让浏览器过载。典型的 debounce 函数每个间隔只会调用一次传递的函数;区间通常是第二个参数。我假设对于很多 UI 工作,最佳间隔是不会使浏览器超载的最短时间。在我看来,这正是要做的requestAnimationFrame
事情:
var debounce = function (func, execAsap) {
var timeout;
return function debounced () {
var obj = this, args = arguments;
function delayed () {
if (!execAsap)
func.apply(obj, args);
timeout = null;
};
if (timeout)
cancelAnimationFrame(timeout);
else if (execAsap)
func.apply(obj, args);
timeout = requestAnimationFrame(delayed);
};
}
上面的代码是直接从上面的debounce
链接中抄袭的,但是使用 requestAnimationFrame 而不是 setTimeout。据我了解,这将尽快将传入的函数排队,但是任何传入速度快于浏览器处理能力的调用都将被丢弃。这应该会产生最顺畅的交互。我在正确的轨道上吗?还是我误会了requestAnimationFrame
?
(当然,这只适用于现代浏览器,但是对于 requestAnimationFrame 有一些简单的 polyfill,它们只是回退到 setTimeout。)