题目重点:解释捕获、目标和冒泡,区分阻止传播与阻止默认动作。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 不是所有事件都冒泡;讨论普通DOM click,Shadow DOM边界按composed规则另问。
解题路线
- 传播路径从祖先捕获到target,再对可冒泡事件回到祖先。event.target是原目标,currentTarget是当前监听器所属元素。
- 事件委托在父容器监听,再匹配真正操作元素;点击按钮里的图标时target可能是图标,需要closest并确认属于该容器。
- stopPropagation阻止继续传播,不自动阻止默认导航;preventDefault针对可取消默认行为,passive监听器存在限制。stopImmediatePropagation还影响同元素后续监听器。
- 动态列表适合委托,但不能假定每种事件/ShadowDOM目标都同样;清理监听器与稳定函数引用也影响生命周期。
手动走一遍
列表li内button含span,点span时父监听器用closest(button)定位动作;currentTarget仍是列表容器。链接点击preventDefault可阻止导航,但事件仍可能冒泡到统计监听器。
规模与取舍
k个子元素可把监听器数量降到O(1)容器级,事件路径与匹配深度仍有成本;不会自动减少全部业务处理。
易错点与追问
容易失分的边界
- target/currentTarget混用。
- stopPropagation取消默认。
- 委托选择器匹配到容器外节点。
继续深挖
- 不冒泡事件怎么处理?
- ShadowDOM的retargeting如何影响委托?
技术参考
- MDN Event bubbling:技术语义参考,具体题目按本文约定。
