關(guān)于event.cancelBubble和event.stopPropagation()的區(qū)別介紹
更新時(shí)間:2011年12月11日 22:57:30 作者:
cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他瀏覽器的疑惑介紹。
首先我在網(wǎng)上看到不少文章大體上分為兩個(gè)(不正確)觀點(diǎn):
1. cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他瀏覽器。
先不講上面是對(duì)是錯(cuò)
先看一個(gè)例子:(測(cè)試環(huán)境: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>無標(biāo)題頁</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>
經(jīng)過測(cè)試:
a,chrom5.0.275.7, opera10.53, ie6,7,8在這幾個(gè)瀏覽器中 , cancelBubble是有效的,并且可以阻止事件冒泡,使body的onclick不能觸發(fā)。只觸發(fā)button的click
alert(event.cancelBubble);輸出結(jié)果true
b,在 moz3.6.4版本內(nèi),是不能阻止body的onclick的,但是alert(event.cancelBubble);輸出結(jié)果仍然是true ,我想這應(yīng)該是event.cancelBubble只是給event添加一個(gè)屬性,并且賦值為true;
當(dāng)把js代碼改成這樣時(shí):
<script language="javascript" type="text/javascript">
function clickBtn(event)
{
event=event?event:window.event;
event.stopPropagation();
alert("123");
}
</script>
即可有效阻止。當(dāng)然在chrome,opera中的 event.stopPropagation();也是有效的,
結(jié)論一:以上說明 event.cancelBubble在新版本chrome,opera瀏覽器中已經(jīng)支持,就差moz了,其實(shí)個(gè)人認(rèn)為event.cancelBubble比event.stopPropagation()更好,不僅從英文意思上。所以希望moz再發(fā)新版本 也支持。這樣就兼容了
2.還有就是經(jīng)??吹年P(guān)于事件順序的問題:
不完全準(zhǔn)確的結(jié)論(自認(rèn)為)
ie:源事件元素->>父級(jí)元素事件->>body-->>document
moz:等其他瀏覽器與上面相反
先看一個(gè)例子:
<!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>無標(biāo)題頁</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>
如果按照上面的觀點(diǎn) 我現(xiàn)在點(diǎn)擊button 事件從 body---->div----->button,,,,那么就是 先alertbody然后再觸發(fā)div彈出123,由于阻止冒泡,所以button的click不會(huì)觸發(fā)。
但經(jīng)過我們測(cè)試。moz還是按照由內(nèi)向外觸發(fā)。正確的執(zhí)行alert("btn")--->>alert("123")----阻止冒泡 不觸發(fā)body的click事件
到這你是不是會(huì)懷疑上面不正確,不過上面的講法對(duì)用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>無標(biāo)題頁</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>
用這種方法 是符合的。執(zhí)行結(jié)果是觸發(fā)ul的click事件然后由于阻止了冒泡所以此時(shí)你點(diǎn)擊li時(shí),其本身的click事件不觸發(fā)。(順便說一句,用這種動(dòng)態(tài)添加事件的方法,好像 event.cancelBubble在moz中也有效了不過在chrome和moz中有區(qū)別)
1. cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他瀏覽器。
先不講上面是對(duì)是錯(cuò)
先看一個(gè)例子:(測(cè)試環(huán)境:chrom5.0.275.7, moz3.6.4, opera10.53, ie6,7,8)
復(fù)制代碼 代碼如下:
<!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>無標(biāo)題頁</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>
經(jīng)過測(cè)試:
a,chrom5.0.275.7, opera10.53, ie6,7,8在這幾個(gè)瀏覽器中 , cancelBubble是有效的,并且可以阻止事件冒泡,使body的onclick不能觸發(fā)。只觸發(fā)button的click
alert(event.cancelBubble);輸出結(jié)果true
b,在 moz3.6.4版本內(nèi),是不能阻止body的onclick的,但是alert(event.cancelBubble);輸出結(jié)果仍然是true ,我想這應(yīng)該是event.cancelBubble只是給event添加一個(gè)屬性,并且賦值為true;
當(dāng)把js代碼改成這樣時(shí):
復(fù)制代碼 代碼如下:
<script language="javascript" type="text/javascript">
function clickBtn(event)
{
event=event?event:window.event;
event.stopPropagation();
alert("123");
}
</script>
即可有效阻止。當(dāng)然在chrome,opera中的 event.stopPropagation();也是有效的,
結(jié)論一:以上說明 event.cancelBubble在新版本chrome,opera瀏覽器中已經(jīng)支持,就差moz了,其實(shí)個(gè)人認(rèn)為event.cancelBubble比event.stopPropagation()更好,不僅從英文意思上。所以希望moz再發(fā)新版本 也支持。這樣就兼容了
2.還有就是經(jīng)??吹年P(guān)于事件順序的問題:
不完全準(zhǔn)確的結(jié)論(自認(rèn)為)
ie:源事件元素->>父級(jí)元素事件->>body-->>document
moz:等其他瀏覽器與上面相反
先看一個(gè)例子:
復(fù)制代碼 代碼如下:
<!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>無標(biāo)題頁</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>
如果按照上面的觀點(diǎn) 我現(xiàn)在點(diǎn)擊button 事件從 body---->div----->button,,,,那么就是 先alertbody然后再觸發(fā)div彈出123,由于阻止冒泡,所以button的click不會(huì)觸發(fā)。
但經(jīng)過我們測(cè)試。moz還是按照由內(nèi)向外觸發(fā)。正確的執(zhí)行alert("btn")--->>alert("123")----阻止冒泡 不觸發(fā)body的click事件
到這你是不是會(huì)懷疑上面不正確,不過上面的講法對(duì)用addListenter和attachEvent添加的事件是正確的()。如:
復(fù)制代碼 代碼如下:
<!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>無標(biāo)題頁</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>
用這種方法 是符合的。執(zhí)行結(jié)果是觸發(fā)ul的click事件然后由于阻止了冒泡所以此時(shí)你點(diǎn)擊li時(shí),其本身的click事件不觸發(fā)。(順便說一句,用這種動(dòng)態(tài)添加事件的方法,好像 event.cancelBubble在moz中也有效了不過在chrome和moz中有區(qū)別)
您可能感興趣的文章:
- MySQL數(shù)據(jù)庫事務(wù)隔離級(jí)別介紹(Transaction Isolation Level)
- spring事物傳播propagation類別含義詳解
- spring事務(wù)Propagation及其實(shí)現(xiàn)原理詳解
- python實(shí)現(xiàn)BackPropagation算法
- JavaScript中使用stopPropagation函數(shù)停止事件傳播例子
- js中的preventDefault與stopPropagation詳解
- Jquery阻止事件冒泡 event.stopPropagation
- 阻止JavaScript事件冒泡傳遞(cancelBubble 、stopPropagation)
- 淺談spring中isolation和propagation的用法
相關(guān)文章
自動(dòng)設(shè)置iframe大小的jQuery代碼
自動(dòng)設(shè)置iframe的寬度在應(yīng)用中還是比較廣泛的,本文使用jquery實(shí)現(xiàn)一下,感興趣的朋友可以參考下2013-09-09
jQuery插件zTree實(shí)現(xiàn)獲取一級(jí)節(jié)點(diǎn)數(shù)據(jù)的方法
這篇文章主要介紹了jQuery插件zTree實(shí)現(xiàn)獲取一級(jí)節(jié)點(diǎn)數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了jQuery插件zTree針對(duì)節(jié)點(diǎn)的遍歷與獲取操作相關(guān)技巧,需要的朋友可以參考下2017-03-03
使用jquery為table動(dòng)態(tài)添加行的實(shí)現(xiàn)代碼
最近,有需要做一個(gè)動(dòng)態(tài)的給table,添加行,用了點(diǎn)時(shí)間,算是做成了。已測(cè)試過,但如果發(fā)現(xiàn)有什么bug,可以留言,歡迎拍磚。大家一起進(jìn)步。2011-03-03
select標(biāo)簽?zāi)M/美化方法采用JS插件
select標(biāo)簽的外觀問題很惱人,各個(gè)瀏覽器都不一致,單單就IE,一個(gè)版本就一個(gè)長相,還不能用CSS修飾,接下來將本人對(duì)select的美化方法共享出來,感興趣的朋友可以參考下2013-04-04
jQuery實(shí)現(xiàn)字符串按指定長度加入特定內(nèi)容的方法
這篇文章主要介紹了jQuery實(shí)現(xiàn)字符串按指定長度加入特定內(nèi)容的方法,實(shí)例分析了jQuery操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
jQuery實(shí)現(xiàn)帶滾動(dòng)導(dǎo)航效果的全屏滾動(dòng)相冊(cè)實(shí)例
這篇文章主要介紹了jQuery實(shí)現(xiàn)帶滾動(dòng)導(dǎo)航效果的全屏滾動(dòng)相冊(cè),涉及jQuery針對(duì)頁面圖片元素與鼠標(biāo)事件的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06

