关于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中有关IE版本检测
Jan 04 Javascript
全面解析bootstrap格子布局
May 22 Javascript
详解ES6中的let命令
Apr 05 Javascript
原生JS中slice()方法和splice()区别
Mar 06 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
Angularjs中的$apply及优化使用详解
Jul 02 Javascript
vue-router动态设置页面title的实例讲解
Aug 30 Javascript
Angular使用cli生成自定义文件、组件的方法
Sep 04 Javascript
AngularJS上传文件的示例代码
Nov 10 Javascript
Vuex的各个模块封装的实现
Jun 05 Javascript
VUE实现吸底按钮
Mar 04 Vue.js
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
图解上海144收音机
2021/03/02 无线电
PHP中cookies使用指南
2007/03/16 PHP
一个典型的PHP分页实例代码分享
2011/07/28 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
python selenium xpath定位操作
2020/09/01 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
总经理助理工作职责
2014/02/06 职场文书
校园安全教育广播稿
2014/02/17 职场文书
学校督导评估方案
2014/06/10 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
vue使用watch监听属性变化
2022/04/30 Vue.js