7

我知道一个事件有两种模式——冒泡和捕获。

当事件设置为冒泡时,Javascript 是否会检查“文档”?

当事件设置为捕获时,Javascript 是否总是从“文档”开始?

Javascript 如何知道在哪里停止/开始?

假设我的正文标签中有以下代码。

<div id='outer'>
    <div id='inner'></div>
</div>

当我将事件设置#inner为冒泡时,Javascript 是检查文档还是停止#outer

4

3 回答 3

5

来自 W3C文档对象模型事件

我知道我在吹毛求疵,但处理您描述的事件的不是 javascript,而是 DOM 引擎(文档对象模型)。在浏览器中,javascript 和 DOM 引擎之间存在绑定,因此可以将事件传播到 javascript,但不限于 javascript。例如 MSIE 支持 BASIC。

当事件设置为冒泡时,Javascript 是否会检查“文档”?

1.2.3 “这种向上传播将持续到并包括文档”

“任何事件处理程序都可以选择通过调用 Event 接口的 stopPropagation 方法来阻止进一步的事件传播。如果任何 EventListener 调用此方法,当前 EventTarget 上的所有其他 EventListener 都将被触发,但在该级别将停止冒泡”

当事件设置为捕获时,Javascript 是否总是从“文档”开始?

1.2.2 “捕获从树的顶部操作,通常是文档,”

于 2012-09-25T05:31:21.237 回答
2

事件冒泡

JavaScript 一直检查到文档。如果您在文档上添加一个侦听器,在内部添加一个侦听器,则两个侦听器都会触发。

事件捕获

JavaScript 从文档开始,一直到内部。如果您在文档上添加一个侦听器,在内部添加一个侦听器,则两个侦听器都会触发。


我的发现

事实证明,浏览器做了某种智能处理,所以它

a) 不必遍历整个父层次结构

b) 不必遍历所有事件。


证明

a) 当点击内部 div 时,浏览器没有时间触发两个点击事件:

小提琴

b) 当存在许多附加到不在父层次结构中的其他 DOM 元素的其他事件时,当点击内部 div 时,浏览器没有时间触发两个点击事件:

小提琴

于 2012-09-25T04:44:53.093 回答
1

部分回答..

1 - 当事件设置为冒泡时,Javascript 是否检查“文档”?

如果层次结构中的元素之一决定通过调用 stopPropagation() 来停止冒泡,则不会

于 2012-09-25T05:07:08.213 回答