關(guān)于event.cancelBubble和event.stopPropagation()的區(qū)別介紹
更新時間:2011年12月11日 22:57:30 作者:
cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他瀏覽器的疑惑介紹。
首先我在網(wǎng)上看到不少文章大體上分為兩個(不正確)觀點:
1. cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他瀏覽器。
先不講上面是對是錯
先看一個例子:(測試環(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)過測試:
a,chrom5.0.275.7, opera10.53, ie6,7,8在這幾個瀏覽器中 , 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添加一個屬性,并且賦值為true;
當(dāng)把js代碼改成這樣時:
<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了,其實個人認(rèn)為event.cancelBubble比event.stopPropagation()更好,不僅從英文意思上。所以希望moz再發(fā)新版本 也支持。這樣就兼容了
2.還有就是經(jīng)??吹年P(guān)于事件順序的問題:
不完全準(zhǔn)確的結(jié)論(自認(rèn)為)
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>無標(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>
如果按照上面的觀點 我現(xiàn)在點擊button 事件從 body---->div----->button,,,,那么就是 先alertbody然后再觸發(fā)div彈出123,由于阻止冒泡,所以button的click不會觸發(fā)。
但經(jīng)過我們測試。moz還是按照由內(nèi)向外觸發(fā)。正確的執(zhí)行alert("btn")--->>alert("123")----阻止冒泡 不觸發(fā)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>無標(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事件然后由于阻止了冒泡所以此時你點擊li時,其本身的click事件不觸發(fā)。(順便說一句,用這種動態(tài)添加事件的方法,好像 event.cancelBubble在moz中也有效了不過在chrome和moz中有區(qū)別)
1. cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他瀏覽器。
先不講上面是對是錯
先看一個例子:(測試環(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)過測試:
a,chrom5.0.275.7, opera10.53, ie6,7,8在這幾個瀏覽器中 , 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添加一個屬性,并且賦值為true;
當(dāng)把js代碼改成這樣時:
復(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了,其實個人認(rèn)為event.cancelBubble比event.stopPropagation()更好,不僅從英文意思上。所以希望moz再發(fā)新版本 也支持。這樣就兼容了
2.還有就是經(jīng)??吹年P(guān)于事件順序的問題:
不完全準(zhǔn)確的結(jié)論(自認(rèn)為)
ie:源事件元素->>父級元素事件->>body-->>document
moz:等其他瀏覽器與上面相反
先看一個例子:
復(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>
如果按照上面的觀點 我現(xiàn)在點擊button 事件從 body---->div----->button,,,,那么就是 先alertbody然后再觸發(fā)div彈出123,由于阻止冒泡,所以button的click不會觸發(fā)。
但經(jīng)過我們測試。moz還是按照由內(nèi)向外觸發(fā)。正確的執(zhí)行alert("btn")--->>alert("123")----阻止冒泡 不觸發(fā)body的click事件
到這你是不是會懷疑上面不正確,不過上面的講法對用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事件然后由于阻止了冒泡所以此時你點擊li時,其本身的click事件不觸發(fā)。(順便說一句,用這種動態(tài)添加事件的方法,好像 event.cancelBubble在moz中也有效了不過在chrome和moz中有區(qū)別)
您可能感興趣的文章:
- MySQL數(shù)據(jù)庫事務(wù)隔離級別介紹(Transaction Isolation Level)
- spring事物傳播propagation類別含義詳解
- spring事務(wù)Propagation及其實現(xiàn)原理詳解
- python實現(xiàn)BackPropagation算法
- JavaScript中使用stopPropagation函數(shù)停止事件傳播例子
- js中的preventDefault與stopPropagation詳解
- Jquery阻止事件冒泡 event.stopPropagation
- 阻止JavaScript事件冒泡傳遞(cancelBubble 、stopPropagation)
- 淺談spring中isolation和propagation的用法
相關(guān)文章
IE下使用jQuery重置iframe地址時內(nèi)存泄露問題解決辦法
這篇文章主要介紹了IE下使用jQuery重置iframe地址時內(nèi)存泄露問題解決辦法,需要的朋友可以參考下2015-02-02jQuery實現(xiàn)的浮動層div瀏覽器居中顯示效果
這篇文章主要介紹了jQuery實現(xiàn)的浮動層div瀏覽器居中顯示效果,涉及jQuery及JS動態(tài)操作頁面元素與屬性相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2017-02-02jQuery使用before()和after()在元素前后添加內(nèi)容的方法
這篇文章主要介紹了jQuery使用before()和after()在元素前后添加內(nèi)容的方法,實例分析了jQuery中before()和after()方法添加內(nèi)容的技巧,非常具有實用價值,需要的朋友可以參考下2015-03-03jquery imgareaselect 使用利用js與程序結(jié)合實現(xiàn)圖片剪切
當(dāng)前在ff3下,用jquery的 width()與height()函數(shù),在不設(shè)置圖片的寬度與高度的時候,不能取到 需要在圖片load函數(shù)里面初始化才可以2009-07-07基于jquery編寫的橫向自適應(yīng)幻燈片切換特效的實例代碼
全屏自適應(yīng)jquery焦點圖切換特效,在IE6這個蛋疼的瀏覽器兼容性問題上得到了和諧,兼容IE6。適用瀏覽器:IE6、IE7、IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗.相關(guān)代碼:2013-08-08jQuery使用ajax傳遞json對象到服務(wù)端及contentType的用法示例
這篇文章主要介紹了jQuery使用ajax傳遞json對象到服務(wù)端及contentType的用法,結(jié)合實例形式分析了jQuery使用ajax傳遞json對象數(shù)據(jù)及服務(wù)器響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2020-03-03