您是否偶然尝试实现无限滚动?如果是,请尝试拖动滚动条而不是使用鼠标滚轮。出于某种原因,Chrome 似乎在处理鼠标滚动事件。如果滚动条运行良好,请继续阅读。
这篇文章提供了一个经历类似事情的人的详细演练 - https://github.com/TryGhost/Ghost/issues/7934
我在scroll 事件上附加了一个观察者,它会触发一个 AJAX 请求。我已经限制了请求,可以看到只发送了 1 个。我看到我的开发服务器在几毫秒内返回响应,但 chrome 会有 2 秒的延迟。没有渲染,没有 api 调用,没有脚本执行。但是对于 14kb,“内容下载”需要 3 秒。其他浏览器都没有这个问题。
我偶然发现使用requestAnimationFrame 而不是setTimeout 可以解决问题的建议。当“等待”或绿色很重要时,这种方法似乎有效,而不是“内容下载”或蓝色。
经过数小时的挖掘,我尝试在 mousewheel 事件上有条件地调用 e.preventDefault(),令我惊讶的是,它成功了。
需要注意的几点:
1) 我没有使用mousewheel 事件来进行 api 调用。我使用了scroll 事件和限制。
2) mousewheel 事件是非标准的,不应使用。见https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel
3) 但在这种情况下,由于 chrome,您必须观察和处理 mousewheel 事件。如果其他浏览器不支持该事件,则它们会忽略该事件,而且我还没有看到它会导致其他浏览器出现问题。
4) 您不想每次都调用preventDefault(),因为这会禁用鼠标滚动:) 如果您使用垂直滚动,您只想在deltaY 为1 时调用它。您可以从附图中看到deltaY 在您基本上无法滚动时为1。即使页面无法滚动,也会触发 mousewheel 事件。附带说明一下,deltaX 在垂直滚动时为 -0,deltaY 在水平滚动时为 -0。
我的解决方案:
window.addEventListener("mousewheel", (e) => {
if (e.deltaY === 1) {
e.preventDefault();
}
})
这是我见过的唯一可行的解决方案,我还没有在其他地方看到它提到或讨论过。我希望这会有所帮助。
console log of mousewheel event