关于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 相关文章推荐
添加到收藏夹代码(兼容几乎所有的浏览器)
Jan 09 Javascript
javascript 有用的脚本函数
May 07 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
Aug 03 Javascript
模拟select的代码
Oct 19 Javascript
JS 退出系统并跳转到登录界面的实现代码
Jun 29 Javascript
文本框只能输入数字的js代码(含小数点)
Jul 10 Javascript
javascript 数据存储的常用函数总结
Jun 01 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 Javascript
angular+ionic返回上一页并刷新页面
Aug 08 Javascript
js模块加载方式浅析
Aug 12 Javascript
Vue的路由动态重定向和导航守卫实例
Mar 17 Javascript
layui 弹出层回调获取弹出层数据的例子
Sep 02 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
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
vue+iview+less 实现换肤功能
2018/08/17 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Python 自动化表单提交实例代码
2017/06/08 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
蔻驰英国官网:COACH英国
2020/07/19 全球购物
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
自我评价是什么
2014/01/04 职场文书
车间主任岗位职责
2014/03/16 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
领导欢迎词范文
2015/01/26 职场文书
员工给公司的建议书
2019/06/24 职场文书
宪法宣传标语100条
2019/10/15 职场文书