js事件冒泡原理及處理


事件從根節點開始,逐級派送到子節點,若節點綁定了事件動作,則執行動作,然后繼續走,這個階段稱為“捕獲階段(Capture)”;
執行完捕獲階段后,事件由子節點往根節點派送,若節點綁定了事件動作,則執行動作,然后繼續走,這個階段稱為“冒泡階段(Bubble)

由於這兩派瀏覽器的差異,其綁定的方法也不一樣,其中

1、遵循標准的瀏覽器使用W3C定義的addEventListener函數綁定,函數定義如下:

function addEventListener(string eventFlag, function eventFunc, [bool useCapture=false])
eventFlag : 事件名稱,如click、mouseover…
eventFunc: 綁定到事件中執行的動作
useCapture: 指定是否綁定在捕獲階段,true為是,false為否,默認為true
在事件監聽流中可以使用event.stopPropagation()來阻止事件繼續往下流

2、IE中使用自有的attachEvent函數綁定時間,函數定義如下:
function attachEvent(string eventFlag, function eventFunc)
eventFlag: 事件名稱,但要加上on,如onclick、onmouseover…
eventFunc: 綁定到事件中執行的動作

在事件監聽流中可以使用window.event.cacenlBubble=true來阻止事件繼續往下流

總結:addEventListener(string eventFlag, function eventFunc, [bool useCapture=false]),針對ff,chrome,safari瀏覽器,false指冒泡階段,默認為true,指捕獲階段。不過一般我們 都用false。

 attachEvent(string eventFlag, function eventFunc),針對ie系列、還有opera瀏覽器,少了事件處理機制的參數,只指定事件類型(別忘了on)和觸發哪個函數。

 

有了這些認知之后,有了大致的思路,對應的代碼:

if(document.addEventListener){

document.addEventListener('click', hideBox, false);

在document綁定信息框(豎的那個)隱藏函數(即隨便點html頁面的哪里關閉展開的信息框,這也是使用document.addEventListener的原因,要幫在文檔上)

document.getElementById('status_hide').addEventListener('click', showBox, false);

在status_hide節點綁定信息框展開(詳細的那個)函數並停止事件流(即點擊豎的這個,展開詳細的那個)

document.getElementById('status_show').addEventListener('click', stopEvent, false);

因為false確定的是事件冒泡,為了防止點詳情的時候,向上冒泡到document,觸發document設置的click時hidebox方法,在status_show我們要綁定阻止事件流函數。

}

這個明白了,針對ie再寫個attachEvent的就可以了,當然ie的參數只用2個就可以了,它的時間處理機制就是冒泡不用額外設置。

現在用的源生的較少了,jquery比較多了,但是jquery是默認允許冒泡的,但是也沒有參數來阻止冒泡的,所有我們需要自己手動進行冒泡阻止:

方法1:

$('.show').bind('click',function(e){
    if(e.stopPropagation){
        e.stopPropagation();        
    }
    else{
        e.cancelBubble = true;
    }
});

方法2:

$('.show').bind('click',function(){
    //處理邏輯
    return false;   
});
//注意:這種方法會阻止后面的所有瀏覽器的默認動作,如a標簽會阻止跳轉動作。

最后是一個阻止冒泡的函數,視情況使用:

var stopEvent = function(event){
     e = event || window.event;
     if(e.stopPropagation){ 
        e.stopPropagation(); 
    }
    else {
         e.cancelBubble = true; 
    } 
};    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM