默認(rèn)事件

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(); }

// ]]&gt;

取消默認(rèn)事件

w3c的方法是e.preventDefault(),IE則是使用e.returnValue = false;

preventDefault它是事件對(duì)象(Event)的一個(gè)方法,作用是取消一個(gè)目標(biāo)元素的默認(rèn)行為。既然是說默認(rèn)行為,當(dāng)然是元素必須有默認(rèn)行為才能被取消,如果元素本身就沒有默認(rèn)行為,調(diào)用當(dāng)然就無效了。什么元素有默認(rèn)行為呢?如鏈接<a>,提交按鈕<input type=”submit”>等。當(dāng)Event 對(duì)象的 cancelable為false時(shí),表示沒有默認(rèn)行為,這時(shí)即使有默認(rèn)行為,調(diào)用preventDefault也是不會(huì)起作用的。

我們都知道,鏈接<a>的默認(rèn)動(dòng)作就是跳轉(zhuǎn)到指定頁面,下面就以它為例,阻止它的跳轉(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)行為

caibaojian.com

//

var a = document.getElementById("testA"); a.onclick =function(e){ if(e.preventDefault){ e.preventDefault(); }else{ window.event.returnValue == false; } }

// ]]&gt;

return 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)行為,沒有停止冒泡

caibaojian.com

//

var a = document.getElementById("testB"); a.onclick = function(){ return false; };

// ]]&gt;

下面這個(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)行為

caibaojian.com

//

$("#testC").on('click',function(){ return false; });

// ]]&gt;

總結(jié)使用方法

當(dāng)需要停止冒泡行為時(shí),可以使用

function stopBubble(e) {

//如果提供了事件對(duì)象,則這是一個(gè)非IE瀏覽器

if ( e && e.stopPropagation )

? ? //因此它支持W3C的stopPropagation()方法

? ? e.stopPropagation();

else

? ? //否則,我們需要使用IE的方式來取消事件冒泡

? ? 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;

}

事件注意點(diǎn)

event代表事件的狀態(tài),例如觸發(fā)event對(duì)象的元素、鼠標(biāo)的位置及狀態(tài)、按下的鍵等等;

event對(duì)象只在事件發(fā)生的過程中才有效。

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

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容