关于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判断浏览器的比较全的代码
Feb 13 Javascript
一个js写的日历(代码部分网摘)
Sep 20 Javascript
JQuery index()方法使用代码
Jun 02 Javascript
基于jquery的web页面日期格式化插件
Nov 15 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
Mar 18 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
浅谈js的html元素的父节点,子节点
Aug 06 Javascript
js中的事件委托或是事件代理使用详解
Jun 23 Javascript
vue.js 微信支付前端代码分享
Feb 10 Javascript
vue路由权限校验功能的实现代码
Jun 07 Javascript
vue 使用原生组件上传图片的实例
Sep 08 Javascript
微信小程序实现点击导航条切换页面
Nov 19 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
php set_time_limit()函数的使用详解
2013/06/05 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
php实现登录页面的简单实例
2019/09/29 PHP
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
微信小程序中顶部导航栏的实现代码
2017/03/30 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
JavaScript面向对象精要(上部)
2017/09/12 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
关于python的list相关知识(推荐)
2017/08/30 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
python生成lmdb格式的文件实例
2018/11/08 Python
python 接收处理外带的参数方法
2018/12/03 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
tensorflow多维张量计算实例
2020/02/11 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
仓库管理制度
2014/01/21 职场文书
生日寄语大全
2014/04/08 职场文书
大学生毕业评语
2014/12/31 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
2016大学生党校学习心得体会
2016/01/06 职场文书
导游词之峨眉山
2019/12/16 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技