requestAnimationFrame 没有按预期工作
requestAnimationFrame not working as expected
我正在尝试在 resize
事件中使用 requestAnimationFrame
在 React 中实现去抖动,并编写了以下简单的 CodePen:
https://codepen.io/robloche/pen/RmLjZV
但是 Chrome (v75)、Firefox (v67) 和 Edge (v42) 的行为并不一致,尽管 MDN 指出它应该是。
当我调整 window 的大小时,快速来回拖动边缘,这是控制台中显示的内容:
Chrome Firefox Edge
只有边缘的行为符合我的预期。
我是误会了什么还是故意的?
尽管如此,Edge 和其他两个之间还有另一个不一致之处:当最大化 window 时,调整大小事件在 Edge 上触发一次,在 Chrome 和 Firefox 上触发两次。
这应该不是什么大问题,但我很好奇背后的原因...
您对 requestAnimationFrame 的理解可能是正确的。这里发生的是现在的浏览器确实已经将 resize
事件去抖动到屏幕刷新率 in accordance to the specs.
这可以通过添加两个事件侦听器来演示,一个是去抖动的,一个是 nude:
addEventListener('resize', e => console.log('non-debounced'));
let active = null;
addEventListener('resize', e => {
if(active) {
console.log("cancelling");
cancelAnimationFrame(active);
}
active = requestAnimationFrame(() => {
console.log('debounced');
active = null;
});
});
在上述两种浏览器中,日志将是
non-debounced
debounced
non-debounced
debounced
...
只有一个 "non-debounced" 事件处理程序在两个去抖动事件处理程序之间触发的事实证明,即使是 non-debounced 版本实际上也被浏览器去抖动了。
因此,由于这些事件已经去抖动,因此永远不会达到您的去抖动代码。
我正在尝试在 resize
事件中使用 requestAnimationFrame
在 React 中实现去抖动,并编写了以下简单的 CodePen:
https://codepen.io/robloche/pen/RmLjZV
但是 Chrome (v75)、Firefox (v67) 和 Edge (v42) 的行为并不一致,尽管 MDN 指出它应该是。
当我调整 window 的大小时,快速来回拖动边缘,这是控制台中显示的内容:
Chrome Firefox Edge
只有边缘的行为符合我的预期。
我是误会了什么还是故意的?
尽管如此,Edge 和其他两个之间还有另一个不一致之处:当最大化 window 时,调整大小事件在 Edge 上触发一次,在 Chrome 和 Firefox 上触发两次。 这应该不是什么大问题,但我很好奇背后的原因...
您对 requestAnimationFrame 的理解可能是正确的。这里发生的是现在的浏览器确实已经将 resize
事件去抖动到屏幕刷新率 in accordance to the specs.
这可以通过添加两个事件侦听器来演示,一个是去抖动的,一个是 nude:
addEventListener('resize', e => console.log('non-debounced'));
let active = null;
addEventListener('resize', e => {
if(active) {
console.log("cancelling");
cancelAnimationFrame(active);
}
active = requestAnimationFrame(() => {
console.log('debounced');
active = null;
});
});
在上述两种浏览器中,日志将是
non-debounced
debounced
non-debounced
debounced
...
只有一个 "non-debounced" 事件处理程序在两个去抖动事件处理程序之间触发的事实证明,即使是 non-debounced 版本实际上也被浏览器去抖动了。
因此,由于这些事件已经去抖动,因此永远不会达到您的去抖动代码。