切换导航
简历
工具
演示
查询
导航菜单
服务端
30
前端
114
数据库
82
进阶开发
8
桌面程序
2
QA
15
软件使用
36
规范协议
5
操作系统
11
AI
0
复用资源
6
硬件
0
标签
HTML
正则表达式
Json
包管理工具
vite
CSS
XPath
JavaScript
Jquery
less
ES6
Vue
React
vue 3
Layui
editor.md
sea.js
Zepto.js
mysql.js
mssql.js
NodeJs
Express
前端template
YAML
杂项
外部链接
.NET Core SDK和运行时安装包
淘宝 NPM 镜像
查询网
Tables Generator线上表格转换工具
引用cdn在线脚本和样式
首页
前端
JS 事件冒泡阻止和问题汇总
[TOC] ### 1. 阻止冒泡方法 阻止事件向上传递需要使用到 `event` 对象下的 `stopPropagation()` 方法,对于低版本的浏览器不支持 `stopPropagation()` 方法,则需要使用 `window.event.cancelBubble` 属性,当这个属性为true时就可阻止冒泡 **通用示例代码:** ```JS //阻止事件冒泡,e触发的事件 function stopBubble(e) { //如果提供了事件对象,则这是一个非IE浏览器 if (e && e.stopPropagation) //因此它支持W3C的stopPropagation()方法 e.stopPropagation(); else //否则,我们需要使用IE的方式来取消事件冒泡 window.event.cancelBubble = true; } ``` > Tip:本文中出现的stopBubble(event),都来自于此通用示例代码 ### 2. 成功阻止冒泡应用 点击id=innerButton的按钮,id=innerContainer的div点击事件不会触发,这样就阻止了事件的向上传递,现实场景中这种需求是很普遍的,事件传递有时会造成一些不必要的不良用户体验,也会影响页面的渲染效果和性能 ```HTML <!DOCTYPE html> <html> <body> <button id="outerButton">外部按钮</button> <div id="innerContainer" style="border: 1px solid #ddd;margin: 20px 0px;"> <button id="innerButton">内部按钮</button> </div> <script> document.getElementById("outerButton").addEventListener("click", function (event) { console.log("外部按钮被点击"); }); document.getElementById("innerButton").addEventListener("click", function (event) { console.log("内部按钮被点击"); stopBubble(event); // 阻止事件冒泡 }); document.getElementById("innerContainer").addEventListener("click", function (event) { console.log("内部容器被点击"); }); </script> </body> </html> ``` ### 3. 阻止冒泡失败案例 **bug描述:**之前在写阻止冒泡的时候出现过一次bug,原因是对元素的默认行为和事件没搞清楚,bug的代码如下,这段代码本来要达到的目的是点击span标签时,触发span的点击事件即可,不要触发到a标签上的事件,但下面的这种写法确怎么也无法阻止事件的冒泡行为 **bug代码示例:** ```HTML <!DOCTYPE html> <html> <body> <div style="border: 1px solid red;margin: 20px 0px;"> <a id="linka1" href="javascript:linka()">你无法阻止我冒泡 <span id="links1">小a你不许冒泡</span></a> </div> <script> document.getElementById("links1").addEventListener("click", function (event) { console.log("span1点击"); stopBubble(event); // 阻止事件冒泡 }); function linka() { console.log("我冒泡了"); } </script> </body> </html> ``` **bug产生的原因:**出现这种bug的原因就是a标签的href属性,示例中`href="javascript:linka()"`的写法不是真的点击事件,href它是a标签的默认行为,所以正常阻止事件冒泡的写法是不会起作用的,所以解决这种情况的思路有以下两种 1. 改变a标签的写法,使用正常的`onclick`来触发点击事件 ```HTML <!DOCTYPE html> <html> <body> <div style="border: 1px solid red;margin: 20px 0px;"> <a id="linka1" href="javascript:void(0)" onclick="linka()">你无法阻止我冒泡 <span id="links1">小a你不许冒泡</span></a> </div> <script> document.getElementById("links1").addEventListener("click", function (event) { console.log("span1点击"); stopBubble(event); // 阻止事件冒泡 }); function linka() { console.log("我冒泡了"); } </script> </body> </html> ``` 2. span标签点击时,阻止a标签的默认行为,使用`event.preventDefault()` ```HTML <!DOCTYPE html> <html> <body> <div style="border: 1px solid red;margin: 20px 0px;"> <a id="linka1" href="javascript:linka()">你无法阻止我冒泡 <span id="links1">小a你不许冒泡</span></a> </div> <script> document.getElementById("links1").addEventListener("click", function (event) { console.log("span1点击"); event.preventDefault() // 可以阻止a标签的默认行为 }); function linka() { console.log("我冒泡了"); } </script> </body> </html> ```
扫一扫手机看
点击排行
windows 文件资源管理器使用
Layui 弹窗open使用说明
SQL Server 中字符串函数使用
C# 使用QQ邮箱代理做邮件接收功能
SQL Server关于apply的两种形式cross apply 和 outer apply
ASP.NET MVC 模型的自定义验证
nvm安装及常用命令
SQL Server 中数据类型转换
SQL Server 中WITH AS短语的使用
IE浏览器下AJAX缓存问题导致数据不更新的解决办法
订阅号