疑问:为何Targeting phase未将点击事件从div2传播到div1?
问题解答
先把事件传播的三个核心阶段掰明白:
- 捕获阶段:事件从最外层祖先元素向下传递,直到抵达实际被点击的目标元素
- 目标阶段:事件仅在被点击的目标元素本身处理,不会涉及父元素
- 冒泡阶段:事件从目标元素向上回溯到最外层祖先元素,沿途父元素如果注册了冒泡类型的事件(
addEventListener默认不带第三个参数或设为false时就是冒泡监听),就会被触发
你应该是误解了MDN的描述——目标阶段根本不会将事件传播到父元素,它只负责处理目标元素自身的事件绑定。当你点击div2时:
- 首先进入捕获阶段:事件从document向下传递到div2,由于div1没有注册捕获阶段的事件,这一步不会有任何触发
- 然后是目标阶段:处理div2的事件,但你没有给div2绑定点击事件,所以这一步无输出
- 最后进入冒泡阶段:事件从div2向上传递到div1,div1注册了冒泡阶段的点击事件,因此会触发
phase函数,输出BUBBLING_PHASE: 1
你觉得“事件没传播到div1”,是混淆了目标阶段和冒泡阶段的职责——向上传递事件是冒泡阶段的工作,而非目标阶段。实际运行代码点击div2,就能看到log里确实会出现div1的冒泡阶段输出。
额外补充:如果想让div1在捕获阶段就触发事件,只需修改addEventListener的第三个参数为true:
div1.addEventListener("click", phase, true);
这时候点击div2,捕获阶段就会触发div1的事件,输出CAPTURING_PHASE: 1,之后冒泡阶段还会再触发一次(除非用stopPropagation阻止事件传播)。
内容的提问来源于stack exchange,提问作者meg hidey
相关产品推荐
相关产品推荐

