关于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 相关文章推荐
JavaScript中void(0)的具体含义解释
Feb 27 Javascript
Mootools 1.2教程 同时进行多个形变动画
Sep 15 Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
Oct 21 Javascript
js实现前端图片上传即时预览功能
Aug 02 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
Mar 03 Javascript
vuex state及mapState的基础用法详解
Apr 19 Javascript
JavaScript常见事件处理程序实例总结
Jan 05 Javascript
微信小程序 下拉刷新及上拉加载原理解析
Nov 06 Javascript
js+canvas实现简单扫雷小游戏
Jan 22 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基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
Javascript中eval函数的使用方法与示例
2007/04/09 Javascript
jquery 常用操作方法
2010/01/28 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
领班岗位职责范文
2014/02/06 职场文书
加入学生会演讲稿
2014/04/24 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
2015高考寄语集锦
2015/02/27 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
2016公司年会主持词
2015/07/01 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS