Javascript 事件冒泡/捕获-从何处开始/结束?

Javascript 事件冒泡/捕获-从何处开始/结束?,javascript,dom-events,event-bubbling,Javascript,Dom Events,Event Bubbling,我知道事件有两种模式——冒泡和捕获 当一个事件设置为bubble时,Javascript是否检查到“document” 当事件设置为捕获时,Javascript是否总是从“文档”开始 Javascript如何知道停止/启动的位置 假设我的body标签中有以下代码 <div id='outer'> <div id='inner'></div> </div> 当我将事件设置为内部冒泡时,Javascript是检查文档还是在外部冒泡时停止

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

当一个事件设置为bubble时,Javascript是否检查到“document”

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

Javascript如何知道停止/启动的位置

假设我的body标签中有以下代码

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

当我将事件设置为内部冒泡时,Javascript是检查文档还是在外部冒泡时停止

JavaScript一直检查到文档。如果在文档中添加一个侦听器,在内部添加一个侦听器,则两个侦听器都会启动

事件捕获

JavaScript从文档开始,一直到内部。如果在文档中添加一个侦听器,在内部添加一个侦听器,则两个侦听器都会启动。


我的发现

事实证明,浏览器进行了某种智能处理,因此

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

b) 不必循环所有事件。


证明

a) 当单击内部div时,浏览器不会花费时间触发两个单击事件:

b) 当存在大量附加到不在父层次结构中的其他DOM元素的其他事件时,当单击内部div时,浏览器会立即触发这两个单击事件:

部分答案

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

如果层次结构中的一个元素决定通过从W3C调用stopperPagation()停止冒泡,则不会

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

当一个事件设置为bubble时,Javascript是否检查到“document”

“此向上传播将持续到并包括文档”

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

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


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

quirksmode中提供了大量信息的文章:@techfoobar//我确实读过那篇文章,但不清楚Javascript是检查文档还是在父元素处停止。如果它在外部停止,它怎么知道document.body或类似文件上是否有任何事件侦听器?@johnkullak//我猜Javascript维护了一个事件列表或类似的东西。阅读W3C以了解事件如何工作。事件冒泡//即使文档没有事件?