一、
-
事件:文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互空間,如點(diǎn)擊事件,鼠標(biāo)移動(dòng)事件等。
-
事件流:從頁(yè)面中接收事件的順序。
事件流有事件冒泡流和事件捕獲流兩種。
IE的事件流是事件冒泡流,從最具體的元素接收,逐級(jí)向上傳播到較為不具體的元素
事件捕獲流:從不具體的元素傳播到具體的元素。
(將事件處理程序添加到事件流的冒泡階段,可以最大限度地兼容各種瀏覽器)
二、
- 添加事件處理程序的三種方法:addEventListener,on+事件名,attachEvent;
-
addEventListener 是添加DOM2級(jí)事件處理程序的方法
可以添加多個(gè)事件處理程序,按照添加的順序執(zhí)行
element.addEventListener(event,callback,true/false);
inner.addEventListener('click',function(e){
//code here;
},true);
(刪除事件處理程序:
element.removeEventListener()
)
-
on+事件名 是添加DOM0級(jí)事件處理程序的方法
不可以用來(lái)添加多個(gè)事件處理程序
element.onclick = function(e) {
//code here;
}
(刪除事件處理程序:
element.onclick=null
)
-
attachEvent 是 IE6-IE10 添加事件處理程序的方法
可以添加多個(gè)事件處理程序,按照添加的順序反向執(zhí)行
attachEvent()方法注冊(cè)的事件處理程序,會(huì)在全局作用域中運(yùn)行,因此函數(shù)中的this等于window
element.attachEvent('onclick',function(e){
//code here;
}
(刪除事件處理程序:
detachEvent()
)
三、
- DOM2級(jí)事件規(guī)定的事件流包括三個(gè)階段:事件捕獲階段、處于目標(biāo)階段、事件冒泡階段。
- 用 addEventListener 注冊(cè)為 true 的事件處理程序在捕獲階段發(fā)生,
用 addEventListener 注冊(cè)為 false 或者 on+事件名 的事件處理程序在 冒泡 階段發(fā)生,
用 attachEvent 注冊(cè)的事件處理程序在冒泡階段發(fā)生。
- DOM事件流中,實(shí)際的目標(biāo)在捕獲階段不會(huì)接收到事件,處于目標(biāo)階段,事件在目標(biāo)上發(fā)生并當(dāng)做冒泡階段的一部分,作為冒泡階段的起點(diǎn),然后一直向上傳播。
- IE9、Safari、Chrome、firefox和Opera9.5及更高版本都會(huì)在捕獲階段觸發(fā)事件對(duì)象上的事件,結(jié)果就有兩個(gè)機(jī)會(huì)在目標(biāo)對(duì)象上操作事件,而且當(dāng)處于目標(biāo)階段的時(shí)候,目標(biāo)的捕獲事件處理程序和目標(biāo)的冒泡事件處理程序?qū)δ繕?biāo)而言都是事件處理程序,事件處理程序按照代碼書寫順序(即綁定順序)發(fā)生,而不是先發(fā)生目標(biāo)的捕獲事件處理程序再發(fā)生冒泡處理程序(注意是對(duì)于目標(biāo)而言)。
四、
-
e: 在IE中通過(guò)DOM0級(jí)添加的事件處理程序中,e是作為全局對(duì)象,可通過(guò)window.event獲得;在IE中通過(guò)attachEvent 方法添加的事件處理程序,event需要作為參數(shù)傳入。
-
e.target :指向最初觸發(fā)事件的 DOM 元素。
e.currentTarget: 指向正在進(jìn)行的事件處理程序所綁定的元素。
e.srcElement: IE6-8沒(méi)有e.target屬性而是e.srcElement;
-
this 在事件處理函數(shù)內(nèi)部代表事件的目標(biāo)元素,等同于e.currentTarget
-
e.type 被觸發(fā)的事件類型
五、
- 阻止事件冒泡
stopPropagation()取消事件的進(jìn)一步捕獲或冒泡;
IE中使用cancelBubble = true;
-
preventDefault():阻止特定事件的默認(rèn)行為,cancelable屬性設(shè)置為true才可以使用;
IE中使用returnValue = false
六、
- 影響頁(yè)面性能:
事件處理程序的數(shù)量關(guān)系到頁(yè)面的整體運(yùn)行性能
原因:
1.每個(gè)事件處理程序都是函數(shù),函數(shù)都是對(duì)象,會(huì)占用內(nèi)存,內(nèi)存中對(duì)象越多,性能就越差。
2.必須事先指定所有事件處理程序而導(dǎo)致DOM的訪問(wèn)次數(shù),會(huì)延遲整個(gè)頁(yè)面的交互就緒時(shí)間。
解決方案:
1.事件委托(限制連接建立的數(shù)量)
在DOM樹上盡量最高的層次添加一個(gè)事件處理程序,根據(jù)觸發(fā)事件的目標(biāo)的屬性執(zhí)行相應(yīng)的代碼。
2.內(nèi)存中留有的過(guò)時(shí)不用的空事件處理程序占用頁(yè)面內(nèi)存也會(huì)影響性能。
解決:移除事件處理程序,確保內(nèi)存可以被再次利用:
空事件處理程序的產(chǎn)生:
1.移除帶有事件處理程序的元素時(shí)(如removeChild和使用innerHTML替換),元素和事件處理程序都保留在內(nèi)存中,沒(méi)有被當(dāng)做垃圾回收,因此需要手工移除事件處理程序。
2:卸載頁(yè)面的時(shí)候。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。