西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)javascript|JQuery → Jquery和JS中終止事件冒泡行為

Jquery和JS中終止事件冒泡行為

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/12/13 14:58:31字體大。A-A+

作者:西西TS點(diǎn)擊:1542次評(píng)論:0次標(biāo)簽: 事件冒泡

  • 類(lèi)型:圖像處理大。23.2M語(yǔ)言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

JavaSciprt事件中有兩個(gè)很重要的特性:事件冒泡以及目標(biāo)元素。事件冒泡: 當(dāng)一個(gè)元素上的事件被觸發(fā)的時(shí)候,比如說(shuō)鼠標(biāo)點(diǎn)擊了一個(gè)按鈕,同樣的事件將會(huì)在那個(gè)元素的所有祖先元素中被觸發(fā)。這一過(guò)程被稱為事件冒泡;這個(gè)事件從原始元素開(kāi)始一直冒泡到DOM樹(shù)的最上層。

目標(biāo)元素: 任何一個(gè)事件的目標(biāo)元素都是最開(kāi)始的那個(gè)元素,在我們的這個(gè)例子中也就是按鈕,并且它在我們的元素對(duì)象中以屬性的形式出現(xiàn)。使用事件代理的話我們可以把事 件處理器添加到一個(gè)元素上,等待一個(gè)事件從它的子級(jí)元素里冒泡上來(lái),并且可以很方便地得知這個(gè)事件是從哪個(gè)元素開(kāi)始的。

事件的冒泡和捕獲
捕獲是從上級(jí)元素到下級(jí)元素,冒泡是從下級(jí)元素到上級(jí)元素.

在IE中,每個(gè)元素和window對(duì)象都有兩個(gè)方法:attachEvent()和detachEvent()。attachEvent()用來(lái)給一個(gè)事件附加事件處理函數(shù)。而detachEvent()用來(lái)將事件處理函數(shù)分離出來(lái)。Eg.

var fnClick = function() {
alert(“Clicked!”);
}
var oDiv = document.getElementById(“div1”);
oDiv.attachEvent(“onclick”, fnClick);
oDiv.detachEvent(“onclick”, fnClick);

事件的冒泡有什么好處呢?

想 象一下現(xiàn)在我們有一個(gè)10列、100行的HTML表格,你希望在用戶點(diǎn)擊表格中的某一單元格的時(shí)候做點(diǎn)什么。比如說(shuō)我有一次就需要讓表格中的每一個(gè)單元格 在被點(diǎn)擊的時(shí)候變成可編輯狀態(tài)。如果把事件處理器加到這1000個(gè)單元格會(huì)產(chǎn)生一個(gè)很大的性能問(wèn)題,并且有可能導(dǎo)致內(nèi)存泄露甚至是瀏覽器的崩潰。相反地, 使用事件代理的話,你只需要把一個(gè)事件處理器添加到table元素上就可以了,這個(gè)函數(shù)可以把點(diǎn)擊事件給截下來(lái),并且判斷出是哪個(gè)單元格被點(diǎn)擊了。

代 碼很簡(jiǎn)單,我們所要關(guān)心的只是如何檢測(cè)目標(biāo)元素而已。比方說(shuō)我們有一個(gè) table元素,ID是“report”,我們?yōu)檫@個(gè)表格添加一個(gè)事件處理器以調(diào)用editCell函數(shù)。editCell函數(shù)需要判斷出傳到table 來(lái)的事件的目標(biāo)元素。考慮到我們要寫(xiě)的幾個(gè)函數(shù)中都有可能用到這一功能,所以我們把它單獨(dú)放到一個(gè)名為getEventTarget的函數(shù)中:

function getEventTarget(e) {
   e = e || window.event;
   return e.target || e.srcElement;
}
e這個(gè)變量表示的是一個(gè)事件對(duì)象,我們只需要寫(xiě)一點(diǎn)點(diǎn)跨瀏覽器的代碼來(lái)返回目標(biāo)元素,在IE里目標(biāo)元素放在srcElemtn屬性或event.toElement屬性中,而在其它瀏覽器里則是target或event.relatedTarget屬性。

接下來(lái)就是editCell函數(shù)了,這個(gè)函數(shù)調(diào)用到了 getEventTarget函數(shù)。一旦我們得到了目標(biāo)元素之后,剩下的事情就是看看它是否是我們所需要的那個(gè)元素了。

function editCell(e) {
   var target = getEventTarget(e);
   if(target.tagName.toLowerCase() === 'td') {
     // DO SOMETHING WITH THE CELL
   }
}
在 editCell函數(shù)中,我們通過(guò)檢查目標(biāo)元素標(biāo)簽名稱的方法來(lái)確定它是否是一個(gè)表格的單元格。這種檢查也許過(guò)于簡(jiǎn)單了點(diǎn);如果它是這個(gè)目標(biāo)元素單元格里 的另一個(gè)元素呢?我們需要為代碼做一點(diǎn)小小的修改以便于其找出父級(jí)的td 元素。如果說(shuō)有些單元格不需要被編輯怎么辦呢?此種情況下我們可以為那些不可編輯的單元格添加一個(gè)指定的樣式名稱,然后在把單元格變成可編輯狀態(tài)之前先檢 查它是否不包含那個(gè)樣式名稱。選擇總是多樣化的,你只需找到適合你應(yīng)用程序的那一種。

事件冒泡的優(yōu)點(diǎn)和缺點(diǎn):
1.那些需要?jiǎng)?chuàng)建的以及駐留在內(nèi)存中的事件處理器少了。

這是很重要的一點(diǎn),這樣我們就提高了性能,并降低了崩潰的風(fēng)險(xiǎn)。

2.在DOM更新后無(wú)須重新綁定事件處理器了。

如果你的頁(yè)面是動(dòng)態(tài)生成的,比如說(shuō)通過(guò)Ajax,你不再需要在元素被載入或者卸載的時(shí)候來(lái)添加或者刪除事件處理器了。

潛在的問(wèn)題也許并不那么明顯,但是一旦你注意到這些問(wèn)題,你就可以輕松地避免它們:你的事件管理代碼有成為性能瓶頸的風(fēng)險(xiǎn),所以盡量使它能夠短小精悍。

不是所有的事件都能冒泡

blur、focus、load和unload不能像其它事件一樣冒泡。事實(shí)上blur和focus可以用事件捕獲而非事件冒泡的方法獲得(在IE之外的其它瀏覽器中)。

需要注意的是:

如果你的代碼處理mousemove事件的話你遇上性能瓶頸的風(fēng)險(xiǎn)可就大了,因?yàn)閙ousemove事件觸發(fā)非常頻繁。而mouseout則因?yàn)槠涔之惖谋憩F(xiàn)而變得很難用事件代理來(lái)管理。

如何避免事件冒泡:

1.方法

2.方法

在IE下解決問(wèn)題很簡(jiǎn)單,用onMouseEnter、 onMouseLeave來(lái)代替onMouseOver、onMouseOut就行了,他們的作用基本相同,前者不會(huì)發(fā)生冒泡。但是 firefox下沒(méi)有這兩個(gè)事件.

3.方法:

window.event.cancelBubble = true (IE)   event.stopPropagation()  event.preventDefault() (Firefox)

阻止jQuery事件冒泡

jQuery對(duì)DOM的事件觸發(fā)具有冒泡特性。有時(shí)利用這一特性可以減少重復(fù)代碼,但有時(shí)候我們又不希望事件冒泡。這個(gè)時(shí)候就要阻止 jQuery.Event冒泡。

在jQuery.Event的文檔中的開(kāi)頭得知,jQuery.Event對(duì)象是符合W3C標(biāo)準(zhǔn)的一個(gè)事件對(duì)象,同時(shí)jQuery.Event免去了檢查兼容IE的步驟。

jQuery.Event提供了一個(gè)非常簡(jiǎn)單的方法來(lái)阻止事件冒泡:event.stopPropagation();

$("p").click(function(event){
     event.stopPropagation();
     // do something
})
但是這個(gè)方法對(duì)使用live綁定的事件沒(méi)有作用,需要一個(gè)更簡(jiǎn)單的方法阻止事件冒泡:return false;

$(this).after("Another paragraph!");
return false;  });

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)