从 Chrome 内容脚本滚动

Scrolling from Chrome content script

我在 Chrome 内容脚本中从鼠标注册 wheel 处理程序调用 window.scrollBy(0, window.innerHeight)。这是为了按页面高度滚动页面(与 PageDown 键的效果相同),但我注意到 Chrome 会立即撤消滚动。由于编程的滚动及其立即撤消,最终效果只是页面闪烁。

不足为奇,如果我从页面控制台 window 执行该函数,它会按预期工作。

奇怪的是,如果我从 setTimeout 调用它,滚动会按预期工作。我通过二进制搜索发现的神奇超时为 175 毫秒——任何小于此值的内容,滚动都将撤消。我也尝试使用 Promise,但它是一样的。我想知道这是为什么。

FWIW,这在 Firefox 上没有任何 setTimeout 箍。

原来这是因为处理程序已注册为 passive. Registering the handler with {passive: false} got the scroll working as intended. More info here