js冒泡和捕獲是事件的兩種行為,使用event.stopPropagation()起到阻止捕獲和冒泡階段中當(dāng)前事件的進(jìn)一步傳播眶拉。使用event.preventDefault()可以取消默認(rèn)事件罗晕。對(duì)于冒泡和捕獲的優(yōu)先順序請(qǐng)看之前文章:JavaScript捕獲和冒泡探討
w3c的方法是e.stopPropagation()济欢,IE則是使用e.cancelBubble = true
stopPropagation也是事件對(duì)象(Event)的一個(gè)方法,作用是阻止目標(biāo)元素的冒泡事件小渊,但是會(huì)不阻止默認(rèn)行為法褥。什么是冒泡事件?如在一個(gè)按鈕是綁定一個(gè)”click”事件酬屉,那么”click”事件會(huì)依次在它的父級(jí)元素中被觸發(fā) 半等。stopPropagation就是阻止目標(biāo)元素的事件冒泡到父級(jí)元素。如:
<div id='div' onclick='alert("div");'>
<ul onclick='alert("ul");'>
<li onclick='alert("li");'>test</li>
</ul>
</div>
上面的代碼,Demo如下,我們單擊test時(shí)酱鸭,會(huì)依次觸發(fā)alert(“l(fā)i”),alert(“ul”),alert(“div”)吗垮,這就是事件冒泡。
冒泡事件
阻止冒泡·
window.event? window.event.cancelBubble = true : e.stopPropagation();
停止冒泡
//
document.getElementById("test").onclick=function(e){ alert("li"); window.event? window.event.cancelBubble = true : e.stopPropagation(); }
// ]]>
w3c的方法是e.preventDefault()凹髓,IE則是使用e.returnValue = false;
preventDefault它是事件對(duì)象(Event)的一個(gè)方法烁登,作用是取消一個(gè)目標(biāo)元素的默認(rèn)行為。既然是說(shuō)默認(rèn)行為蔚舀,當(dāng)然是元素必須有默認(rèn)行為才能被取消饵沧,如果元素本身就沒(méi)有默認(rèn)行為,調(diào)用當(dāng)然就無(wú)效了赌躺。什么元素有默認(rèn)行為呢狼牺?如鏈接<a>,提交按鈕<input type=”submit”>等礼患。當(dāng)Event 對(duì)象的 cancelable為false時(shí)是钥,表示沒(méi)有默認(rèn)行為,這時(shí)即使有默認(rèn)行為缅叠,調(diào)用preventDefault也是不會(huì)起作用的悄泥。
我們都知道,鏈接<a>的默認(rèn)動(dòng)作就是跳轉(zhuǎn)到指定頁(yè)面肤粱,下面就以它為例弹囚,阻止它的跳轉(zhuǎn):
//假定有鏈接<a id="testA" >caibaojian.com</a>
var a = document.getElementById("testA");
a.onclick =function(e){
if(e.preventDefault){
e.preventDefault();
}else{
window.event.returnValue == false;
}
}
演示:阻止鏈接跳轉(zhuǎn)的默認(rèn)行為
//
var a = document.getElementById("testA"); a.onclick =function(e){ if(e.preventDefault){ e.preventDefault(); }else{ window.event.returnValue == false; } }
// ]]>
javascript的return false只會(huì)阻止默認(rèn)行為,而是用jQuery的話則既阻止默認(rèn)行為又防止對(duì)象冒泡领曼。
下面這個(gè)使用原生js鸥鹉,只會(huì)阻止默認(rèn)行為,不會(huì)停止冒泡
<div id='div'? onclick='alert("div");'>
<ul? onclick='alert("ul");'>
<li id='ul-a' onclick='alert("li");'><a >caibaojian.com</a></li>
</ul>
</div>
var a = document.getElementById("testB");
a.onclick = function(){
return false;
};
演示:阻止鏈接默認(rèn)行為庶骄,沒(méi)有停止冒泡
//
var a = document.getElementById("testB"); a.onclick = function(){ return false; };
// ]]>
下面這個(gè)是使用jQuery毁渗,既阻止默認(rèn)行為又停止冒泡
<div id='div'? onclick='alert("div");'>
<ul? onclick='alert("ul");'>
<li id='ul-a' onclick='alert("li");'><a ,function(){
return false;
});
演示:既停止冒泡又阻止默認(rèn)行為
//
$("#testC").on('click',function(){ return false; });
// ]]>
當(dāng)需要停止冒泡行為時(shí),可以使用
function stopBubble(e) {
//如果提供了事件對(duì)象瓢姻,則這是一個(gè)非IE瀏覽器
if ( e && e.stopPropagation )
? ? //因此它支持W3C的stopPropagation()方法
? ? e.stopPropagation();
else
? ? //否則祝蝠,我們需要使用IE的方式來(lái)取消事件冒泡
? ? window.event.cancelBubble = true;
}
當(dāng)需要阻止默認(rèn)行為時(shí),可以使用
//阻止瀏覽器的默認(rèn)行為
function stopDefault( e ) {
? ? //阻止默認(rèn)瀏覽器動(dòng)作(W3C)
? ? if ( e && e.preventDefault )
? ? ? ? e.preventDefault();
? ? //IE中阻止函數(shù)器默認(rèn)動(dòng)作的方式
? ? else
? ? ? ? window.event.returnValue = false;
? ? return false;
}
event代表事件的狀態(tài)幻碱,例如觸發(fā)event對(duì)象的元素、鼠標(biāo)的位置及狀態(tài)细溅、按下的鍵等等褥傍;
event對(duì)象只在事件發(fā)生的過(guò)程中才有效。
firefox里的event跟IE里的不同喇聊,IE里的是全局變量恍风,隨時(shí)可用;firefox里的要用參數(shù)引導(dǎo)才能用,是運(yùn)行時(shí)的臨時(shí)變量朋贬。
在IE/Opera中是window.event凯楔,在Firefox中是event;而事件的對(duì)象锦募,在IE中是window.event.srcElement摆屯,在Firefox中是event.target,Opera中兩者都可用糠亩。
下面兩句效果相同:
//code from http://caibaojian.com/javascript-stoppropagation-preventdefault.htmlfunction a(e){
var e = (e) ? e : ((window.event) ? window.event : null);
var e = e || window.event; // firefox下window.event為null, IE下event為null
}