1、JS事件的3個階段:捕獲、目標、冒泡,低版本IE不支持捕獲階段;javascript
2、在瀏覽器解析事件的時候,有兩種觸發方式:一種叫作Bubbling(冒泡),另一種叫作Capturing(捕獲)。
冒泡的方式效果就是當一個DOM元素的某事件例如click事件被fire時,依次它的父元素的click事件也被fire(觸發),一直傳遞到最頂層的body元素爲止。而捕獲的觸發方式正好相反,當某個元素的click事件被觸發時,先從最頂層的body元素click事件被觸發開始,一直傳遞到真正被觸發的元素爲止。html
一、W3C事件流:
(1)從根文檔(html)開始遍歷全部子節點,若是目標事件的父節點設置爲捕獲時觸發,則執行該事件,直到目標被執行,而後再事件冒泡(設置爲捕獲時觸發的事件再也不被執行)。
(2)支持冒泡和捕獲方法,而且能夠在一個DOM上綁定多個事件處理器,各自不會衝突,
(3)addEvntListener(removeEventListener)有三個參數:第一個-->事件類型;第二個-->處理函數,直接給函數名或函數體;第三個-->布爾值,表示是否支持捕獲事件;
(4)經過addEventListener和removeEventListener來實現函數的添加和刪除。java
二、ie事件流:
(1)從目標事件被執行,而後再冒泡父節點的事件,直到根文檔;
(2)只支持冒泡,而且能夠在一個dom上綁定多個事件處理函數;
(3)attachEvent(detachEvent)參數與W3C標準相同,注意:事件類型前+on;沒有布爾參數;
(4)經過attachevent和detachevent來實現函數的添加和刪除。瀏覽器
三、阻止某瀏覽器DOM元素的默認行爲:
(1)W3C經過調用e.preventDefault();
(2)IE則經過window.event.returnValue=false;dom
四、阻止冒泡事件:
(1)W3C調用e.stopPropagation();或者 return false;
(2)IE經過設置window.event.cancleBubble=true;函數
五、 javascript 兼容W3c和IE的添加(取消)事件監聽方法:代理
//添加事件監聽兼容函數 function addHandler(target, eventType, handler){ if(target.addEventListener){//主流瀏覽器 addHandler = function(target, eventType, handler){ target.addEventListener(eventType, handler, false); }; }else{//IE addHandler = function(target, eventType, handler){ target.attachEvent("on"+eventType, handler); }; } //執行新的函數 addHandler(target, eventType, handler); } //刪除事件監聽兼容函數 function removeHandler(target, eventType, handler){ if(target.removeEventListener){//主流瀏覽器 removeHandler = function(target, eventType, handler){ target.removeEventListener(eventType, handler, false); } }else{//IE removeHandler = function(target, eventType, handler){ target.detachEvent("on"+eventType, handler); } } //執行新的函數 removeHandler(target, eventType, handler); }
3、手寫事件模型及事件代理、委託
一、事件代理/委託的優缺點,是靠冒泡機制來實現的:
優勢:
(1)能夠減小大量內存佔用,減小事件註冊;
(2)能夠實現當新增子對象時,無需再對其綁定事件,對於動態內容部分更合適;
缺點:若是全部事件都用事件代理,則可能會出現事件誤判,即本不該該觸發的對象綁上了事件。code