关于event.cancelBubble和event.stopPropagation()的区别介绍


首先我在网上看到不少文章大体上分为两个(不正确)观点:
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中有区别)



相关阅读:
Jquery 扩展方法
网页制作实例:图片真正居中的方法
checkbox 复选框不能为空
关于ASP.NET在IIS一些问题经验总结
asp.net(c#)ref,out ,params的区别
双系统计算机怎样卸载其中一个?
Oracle10g新特性——正则表达式
ASP在线创建Word与Excel文档
JavaScript判断窗口是否最小化的代码(跨浏览器)
mssql 两种数据插入方式
php学习 字符串课件
在64位Linux环境下安装Oracle数据库10g
脱离Linux新手十要点
AJAX、AJAX实例及AJAX源代码
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 2016年师范生实习总结报告 一个女人对男人的极品评价 七月掠影 最无语的一次 种子的情思 我的“左半边翅膀”作文900字 微小说     对自己最好的描述 2015关于台风灿鸿来袭的通知 用不同的笔写出不同的字作文700字 那一刻令我难以忘怀 2015年社区团委会工作计划 龙年元宵晚会主持人主持词 关于梅溪镇被征地农民和就业社会保障的调查与思考 男方出轨离婚协议书怎么写最好 只为那片云 苏教版七年级下册第一单元写作和口语交际教学设计1 女孩常说的22种谎言 姊妹 五年级春天的校园作文600字 不一样的意义 梅雨季,泪阑珊 彩虹色的雨 遇见,回忆,思念作文600字 我要努力400字 借了谁的春 不忘国耻,振兴中华——读《圆明园的毁灭》有感 精选开业祝福语2014 怎么会是这样的人 儿童励志故事《张融的瘦马》 神伤作文1000字 春之梦作文100字 初一新生自我介绍(经典篇) 心醉书香,感悟人生 爱情文章:你其实很不浪漫只是很温暖 小学五年级作文500字:它的给予——“我和少先队”征文 天地晨曦作文350字 起程反义词,起程近义词,起程造句 遇见了、爱了、哭了、恨了、累了、倦了、痛了、离开了、伤害了、 《深渊》读后感 关于世界经济若干问题的探讨 长隆水上乐园作文 冰上游记作文 美好的家园需要良好的环境 《从外星球来的孩子》读后感400字 珠江流域的太监王朝---广州印象之一百六十七 看筑梦中国观后感1000字 小学六年级作文550字:写给日本首相的一封信 这个世界上最爱你的人是谁 无知的白痴 呵呵 美妙的天空

Copyright © 2016 phpStudy |