关于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 Aajx访问WCF服务(GET、POST、PUT、DELETE)
Mar 16 Javascript
JS加jquery简单实现标签元素的显示或隐藏
Sep 23 Javascript
js arguments,jcallee caller用法总结
Nov 30 Javascript
jQuery使用andSelf()来包含之前的选择集
May 19 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
JavaScript动态添加style节点的方法
Jun 09 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
Jan 27 Javascript
form表单转Json提交的方法(推荐)
Sep 23 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
解决vue-cli3 使用子目录部署问题
Jul 19 Javascript
原生js通过一行代码实现简易轮播图
Jun 05 Javascript
微信小程序自定义单项选择器样式
Jul 25 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 whois查询API制作方法
2011/06/23 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
python的变量与赋值详细分析
2017/11/08 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
PyQt5实现QLineEdit添加clicked信号的方法
2019/06/25 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
python类共享变量操作
2020/09/03 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
工作会议方案
2014/05/21 职场文书
商业用房租赁协议书
2014/10/13 职场文书
骨干教师个人总结
2015/02/11 职场文书
怎样写辞职信
2015/02/27 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android