preventdefault阻止浏览器默认行为,如链接跳转或表单提交;stoppropagation阻止事件在dom树中传播,如冒泡或捕获。二者作用维度不同,可单独或组合使用。

preventDefault 和 stopPropagation 解决的是两类完全不相关的问题:一个管“浏览器该不该做默认动作”,另一个管“事件该不该传给别的元素”。混淆它们,往往是因为没分清“行为”和“传播”这两个维度。
preventDefault:专治“不该发生的默认动作”
它只影响当前元素本身的默认行为,和事件往哪走毫无关系。只要浏览器对这个事件预设了动作,比如点击链接跳转、按回车提交表单、右键弹菜单、空格键滚动页面,都可以用它拦住。
- 典型场景:表单验证时先阻止提交,等校验通过再手动提交
- 典型写法:
e.preventDefault()放在submit或keydown回车处理里 - 注意:调用后事件照常冒泡,父级 click、form 的 submit 监听器仍会执行
stopPropagation:专治“事件乱串门”
它不管浏览器做什么,只负责切断事件在 DOM 树里的传递路径。无论是从子到父的冒泡,还是从外到内的捕获,只要调用了它,事件就停在当前元素,不再继续走。
- 典型场景:轮播图指示点被插件绑了 click,你只想自己处理,不希望插件也响应
- 典型写法:
e.stopPropagation()放在子元素的事件处理函数开头 - 注意:默认行为不受影响——按钮该提交还会提交,除非你同时调用 preventDefault
两者可以独立使用,也能配合出现
比如一个自定义搜索框:回车触发搜索,但既不想提交包裹它的 form,也不希望触发外层 div 的 click 监听器。这时就需要两个都用:
-
e.preventDefault()挡住表单默认提交 -
e.stopPropagation()挡住事件冒泡到父容器
而 return false 在 jQuery 中等价于两者一起调用,在原生 JS 中只是函数返回值,不具备此效果。











