繁体   English   中英

为什么滚动上的事件侦听器在 window 上不起作用

[英]Why event listener on scroll not working on window

我有一个带有属性overflow: auto ,因此,滚动事件仅在此块中触发,尽管我向window object 添加了一个侦听器。

如果我不知道发生事件的特定块的 class 或 id,如何向 window 添加滚动事件侦听器?

 window.addEventListener('scroll', () => { console.log('scroll;') });
 * { margin: 0; padding: 0; } main { height: 100vh; overflow-y: auto; } div { width: 500px; height: 300px; margin: 10px 0; background: rgb(45, 62, 206); }
 <main> <div></div> <div></div> <div></div> <div></div> </main>

和 Rory 在一起,这似乎是X/Y 问题 但回答问题时问:

scroll事件不会冒泡,但您仍然可以通过为捕获阶段添加侦听器( true作为addEventListener的第三个参数)在祖先元素上处理它们。 即使对于不冒泡的事件,也会发生捕获阶段:

window.addEventListener('scroll', () => {
  console.log('scroll!')
}, true); // <===

现场示例:

 window.addEventListener('scroll', () => { console.log('scroll,') }; true);
 * { margin: 0; padding: 0; } main { height: 100vh; overflow-y: auto; } main div { width: 500px; height: 300px; margin: 10px 0; background: rgb(45, 62, 206); }
 <main> <div></div> <div></div> <div></div> <div></div> </main>

这张来自DOM UI 事件规范的图表有助于理解捕获、目标和冒泡阶段:

使用 DOM 事件流在 DOM 树中调度的事件的图形表示,显示事件从 Window 开始并在捕获阶段通过 Document 和 html、body 和一系列其他祖先元素,在目标阶段处于目标元素,然后在冒泡阶段从元素返回到窗口。

在没有冒泡的事件中,它只是冒泡阶段,而不是捕获阶段,不会发生。


(在可运行的示例中,我对与答案无关的 CSS 做了一个改动;这只是为了让 Stack Snippet 工作得更好。Stack Snippet 控制台是文档中的一个 div,所以它受到你的div规则的影响。我只是将规则的选择器更改为main div ,因此它仅适用于main中的元素。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM