关于event.cancelBubble和event.stopPropagation()的区别介绍


Posted in Javascript onDecember 11, 2011

首先我在网上看到不少文章大体上分为两个(不正确)观点:
1. cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他浏览器。
先不讲上面是对是错
先看一个例子:(测试环境:chrom5.0.275.7, moz3.6.4, opera10.53, ie6,7,8)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title>无标题页</title> 
</head> 
<body onclick="alert('body');"> 
<input id="Button1" type="button" value="button" onclick="clickBtn(event)" /> 
<script language="javascript" type="text/javascript"> 
function clickBtn(event) 
{ 
event=event?event:window.event; 
event.cancelBubble=true; 
alert(event.cancelBubble); 
} 
</script> 
</body> 
</html>

经过测试:
a,chrom5.0.275.7, opera10.53, ie6,7,8在这几个浏览器中 , cancelBubble是有效的,并且可以阻止事件冒泡,使body的onclick不能触发。只触发button的click
alert(event.cancelBubble);输出结果true
b,在 moz3.6.4版本内,是不能阻止body的onclick的,但是alert(event.cancelBubble);输出结果仍然是true ,我想这应该是event.cancelBubble只是给event添加一个属性,并且赋值为true;
当把js代码改成这样时:
<script language="javascript" type="text/javascript"> 
function clickBtn(event) 
{ 
event=event?event:window.event; 
event.stopPropagation(); 
alert("123"); 
} 
</script>

即可有效阻止。当然在chrome,opera中的 event.stopPropagation();也是有效的,
结论一:以上说明 event.cancelBubble在新版本chrome,opera浏览器中已经支持,就差moz了,其实个人认为event.cancelBubble比event.stopPropagation()更好,不仅从英文意思上。所以希望moz再发新版本 也支持。这样就兼容了
2.还有就是经常看的关于事件顺序的问题:
不完全准确的结论(自认为)
ie:源事件元素->>父级元素事件->>body-->>document
moz:等其他浏览器与上面相反
先看一个例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title>无标题页</title> 
</head> 
<body onclick="alert('body');"> 
<div onclick="clickBtn(event)" style="width:100px;height:100px; background:#666;"> 
<input id="Button1" type="button" value="button" onclick="alert('btn');" /> 
</div> 
<script language="javascript" type="text/javascript"> 
function clickBtn(event) 
{ 
event=event?event:window.event; 
event.stopPropagation(); 
alert("123"); 
} 
</script> 
</body> 
</html>

如果按照上面的观点 我现在点击button 事件从 body---->div----->button,,,,那么就是 先alertbody然后再触发div弹出123,由于阻止冒泡,所以button的click不会触发。
但经过我们测试。moz还是按照由内向外触发。正确的执行alert("btn")--->>alert("123")----阻止冒泡 不触发body的click事件
到这你是不是会怀疑上面不正确,不过上面的讲法对用addListenter和attachEvent添加的事件是正确的()。如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title>无标题页</title> 
</head> 
<body> 
<ul id='ul'> 
<li id='li1'>List Item1</li> 
<li id='li2'>List Item2</li> 
</ul> 
<script language="javascript" type="text/javascript"> 
function init(){ 
if(!!document.all){ 
document.getElementById('li1').attachEvent('onclick', function(event){ 
alert('li1'); 
}) 
document.getElementById('li2').attachEvent('onclick', function(event){ 
alert('li2'); 
}) 
document.getElementById('ul').attachEvent('onclick', function(event){ 
alert('ul'); 
//event.cancelBubble = true; 
alert(event.stopPropagation); 
}); 
}else{ 
document.getElementById('li1').addEventListener('click', function(event){ 
alert('li1'); 
}, true) 
document.getElementById('li2').addEventListener('click', function(event){ 
alert('li2'); 
}, true) 
document.getElementById('ul').addEventListener('click', function(event){ 
event=event?event:window.event; 
event.stopPropagation(); 
alert('ul'); 
}, true); 
} 
} 
init(); 
</script> 
</body> 
</html>

用这种方法 是符合的。执行结果是触发ul的click事件然后由于阻止了冒泡所以此时你点击li时,其本身的click事件不触发。(顺便说一句,用这种动态添加事件的方法,好像 event.cancelBubble在moz中也有效了不过在chrome和moz中有区别)
Javascript 相关文章推荐
过虑特殊字符输入的js代码
Aug 05 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
Apr 13 Javascript
JavaScript中使用Object.create()创建对象介绍
Dec 30 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
Sep 14 Javascript
JS仿淘宝实现的简单滑动门效果代码
Oct 14 Javascript
实例代码详解jquery.slides.js
Nov 16 Javascript
JavaScript html5 canvas绘制时钟效果(二)
Mar 27 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
Apr 13 Javascript
Webpack的dll功能使用
Jun 28 Javascript
vue根据进入的路由进行原路返回的方法
Sep 26 Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 Javascript
Jquery阻止事件冒泡 event.stopPropagation
Dec 11 #Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
Dec 11 #Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
Dec 11 #Javascript
FireFox下XML对象转化成字符串的解决方法
Dec 09 #Javascript
一个简单的js树形菜单
Dec 09 #Javascript
JS构建页面的DOM节点结构的实现代码
Dec 09 #Javascript
电子商务网站上的常用的js放大镜效果
Dec 08 #Javascript
You might like
javascript编程起步(第二课)
2007/01/10 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
详解javascript函数的参数
2015/11/10 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
python redis 删除key脚本的实例
2019/02/19 Python
python处理大日志文件
2019/07/23 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Python字典底层实现原理详解
2019/12/18 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
个人实用的自我评价范文
2013/11/23 职场文书
路政管理专业个人自荐信范文
2013/11/30 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
车队安全员岗位职责
2015/02/15 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python