关于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 相关文章推荐
Jquery+WebService 校验账号是否已被注册的代码
Jul 12 Javascript
JavaScript 判断日期格式是否正确的实现代码
Jul 04 Javascript
javascript数字格式化通用类 accounting.js使用
Aug 24 Javascript
js替代copy(示例代码)
Nov 27 Javascript
JavaScript函数柯里化详解
Apr 29 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
Aug 15 Javascript
JS常用知识点整理
Jan 21 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
Apr 11 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
echarts统计x轴区间的数值实例代码详解
Jul 07 Javascript
vue-loader中引入模板预处理器的实现
Sep 04 Javascript
Vue实现简单计算器
Jan 20 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
PHP安装全攻略:APACHE
2006/10/09 PHP
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
php 文件上传类代码
2011/08/06 PHP
php获取域名的google收录示例
2014/03/24 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
pyside写ui界面入门示例
2014/01/22 Python
Python实现单词拼写检查
2015/04/25 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
自荐信写法介绍
2014/01/25 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
《愚公移山》教学反思
2014/02/20 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
优质服务演讲稿
2014/05/14 职场文书
管理标语大全
2014/06/24 职场文书
测绘工程专业求职信
2014/07/15 职场文书
2014年行政部工作总结
2014/11/19 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
干部培训工作总结2015
2015/05/25 职场文书
企业宣传稿范文
2015/07/23 职场文书
给校长的建议书范文
2015/09/14 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
DSP接收机前端设想
2022/04/05 无线电