事件冒泡是指事件从目标元素逐级向上传播至document的过程;可通过stopPropagation()阻止冒泡,preventDefault()阻止默认行为,二者作用不同且可共存。
JavaScript 事件冒泡是指当一个元素上的事件被触发时,该事件会从目标元素逐级向上传播到其父元素,直到 document 根节点的过程。这是事件流的默认行为之一(另一个是捕获阶段,但冒泡更常用、更直观)。
比如你点击一个按钮,而这个按钮在 div 里,div 又在 body 里。点击后,事件会先在按钮上触发,然后“冒泡”到 div,再冒泡到 body,最后到 document。每个中间容器如果绑定了同类型的事件监听器(如 click),都会依次执行。
这本身不是 bug,而是设计机制,方便用事件委托(比如给 ul 绑定 click,通过 event.target 判断点的是哪个 li)。
调用事件对象的 stopPropagation() 方法即可中断向上传播:
很多 HTML 元素有自带行为,比如点击 a 标签会跳转、提交表单会刷新页面、按空格键在 checkbox 上会切换选中状态。这些是“默认行为”
,可通过 preventDefault() 阻止:
这两个方法常被混淆,但作用完全不同: