并非所有车轮事件都可以在 Chrome (Opera) 中取消



我发现并非所有车轮事件都可以在Chrome 68(Opera 55(中取消。 例如,有以下代码:

#block {
width: 10em;
height: 10em;
border: 1px solid black;
overflow: auto;
}
#block div {
margin: 0.5em;
padding: 0.5em;
border: 1px solid blue;
}
<div id="block" onwheel="console.log(event.cancelable)">
<div>*****</div>
<div>*****</div>
<div>*****</div>
<div>*****</div>
<div>*****</div>
<div>*****</div>
</div>

如果您运行它并尝试滚动块,您将看到并非所有事件都是可取消的,也就是说,控制台中有false值。

但是,在火狐的情况下,所有事件都是可以取消的。

在我看来,当您取消车轮事件序列中的第一个事件时,所有后续事件也将取消。但是,我如何知道是否存在一系列事件或只有一个可取消事件?

当用户到达块的底部时,我需要更改块的内容。更改内容后,块会自动向上滚动到初始位置,并在内容更改后 100 毫秒内取消所有事件。但是,在Chrome的情况下,我在发生第二个/第三个不可取消的轮子事件后更改了内容(因为当用户尚未到达底部时,第一个不会取消(,然后我无法取消其他事件,因此块在内容更改后滚动。

有什么解决办法吗?Chrome的行为是否正确,或者它可能只是一个错误?

某些内容可能是相对的 Chrome 71 Beta:相对时间格式以及"异步触摸板捏缩放事件"中的更多内容。您可能必须始终调用preventDefault()并使用scrollBy()来模拟默认行为。

我想出了一个相当生硬的解决方案。仅当滚动事件可取消时,我才会更改块的内容。换句话说,当触发一系列轮子事件时,我只关注可取消的事件,如果触发了可取消事件(这是系列中的第一个(并且已经到达块的底部,我会更改块的内容。如果事件不可取消,则将其忽略。

是的,如果几乎已经到达块的底部,但仍然没有到达,则存在一种阻止效果,因为即使用户剧烈滚动滚轮,当到达底部时内容也不会改变。但是,在我看来这不是一个大问题,在这种情况下可以应用优化 - 可以考虑可取消事件的 deltaY 属性,如果它足够大,可以将内容滚动到底部,则事件可能会被取消,内容可能会以编程方式滚动,然后内容可能会更改。

最新更新