[Javascript] Event propagation: useCapture for addEventListener
What gets logged when clicking button?
<div id="outer">
<div id="inner">
<button id="btn">Click me!</button>
</div>
</div>
const outer = document.getElementById("outer");
const inner = document.getElementById("inner");
const button = document.getElementById("btn");
outer.addEventListener("click", () => console.log("A"), true);
outer.addEventListener("click", () => console.log("B"));
inner.addEventListener("click", () => console.log("C"), true);
inner.addEventListener("click", (e) => {
console.log("D");
e.stopPropagation();
console.log("E");
});
button.addEventListener("click", () => console.log("F"));
button.addEventListener("click", () => console.log("G"), true);
There are three phrases during event propagation:
- Capturing: Event goes down from top to bottom of the DOM tree, you don't get access to
event.target
- Targeting: When event reach the target element, it is targeting
- Bubbling: Then event goes up through the tree, is bubbling, you get access to
event.target
outer.addEventListener("click", () => console.log("B")); // this event only get trigger in bubbling
outer.addEventListener("click", () => console.log("A"), true); // this evnet fire during capturing
That's why A -> C -> G
will be logged first during capturing phrase.
Then F
is targeting
D -> E
is bubbling, since we call stopPropagation
, `B` won't be logged.
Answer: A -> C -> G -> F -> D -> E
stopPropagation
vs stopImmediatePropagation
outer.addEventListener("click", () => console.log("A"), true);
outer.addEventListener("click", () => console.log("B"));
inner.addEventListener("click", () => console.log("C"), true);
inner.addEventListener("click", (e) => {
console.log("D");
e.stopPropagation();
console.log("E");
});
inner.addEventListener("click", () => console.log("C2")); // <-- new
button.addEventListener("click", () => console.log("F"));
button.addEventListener("click", () => console.log("G"), true);
A -> C -> G -> F -> D -> E -> C2
outer.addEventListener("click", () => console.log("A"), true);
outer.addEventListener("click", () => console.log("B"));
inner.addEventListener("click", () => console.log("C"), true);
inner.addEventListener("click", (e) => {
console.log("D");
e.stopImmediatePropagation();
console.log("E");
});
inner.addEventListener("click", () => console.log("C2")); // <-- new
button.addEventListener("click", () => console.log("F"));
button.addEventListener("click", () => console.log("G"), true);
A -> C -> G -> F -> D -> E
stopImmediatePropagation
will stop the rest listeners event to be triggered, since C2
is registered after, it won't be triggered.
分类:
Javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-06-20 [Angular 14] Inject() function
2020-06-20 [ML L2 - N19] Naive Bayes GaussianNB
2019-06-20 [Cypress] Reuse Data with Cypress Fixtures
2017-06-20 [Preact] Integrate react-router with Preact
2017-06-20 [Angular] Change component default template (ng-content, ng-template, ngTemplateOutlet, TemplateRef)
2017-06-20 [Angular] Angular Advanced Features - ng-template , ng-container, ngTemplateOutlet
2013-06-20 【大型网站架构 原理】1. 负载均衡和冗余技术