DOM2級事件基礎
DOM0級事件綁定:只能給一個元素的某一個行為綁定一次方法,第二次綁定的會把前面的覆蓋掉
DOM2事件綁定,其實是讓元素通過原型鏈一直找到EventTarget這個內置類原型上的addEventListener方法實現的
DOM2:DOM0中的行為類型,用DOM2一樣可以綁定;而且DOM2中還提供了一些DOM0沒有的行為類型,DOMContentLoaded:當頁面中的DOM結果(HTML結構)加載完成,觸發的行為
window.onload = function(){} :
當頁面中的所有資源都加載完成(圖片、HTML結構、音視頻。。。)才會執行后面的函數;由於使用DOM0級事件綁定,所以在一個頁面中只能用一次,后面在寫會把前面的覆蓋掉;因為它是采用DOM0事件綁定,所以只能綁定一次
jQuery:$(document).ready(function(){}):
只要當頁面中的HTML結構加載完成就會執行對應的函數;並且在同一個頁面中可以出現多次;
原理:使用DOM2事件綁定,並且綁定的行為是DOM2中新增加的那個DOMContentLoaded
window.addEventListener("load", fucntion(){}, false);
window.addEventListener("load", fucntion(){}, false);
DOM2級事件綁定
HTMLElement.addEventListener(event, callBack, boolean)
boolean:為true捕獲階段觸發, 為false冒泡階段觸發
HTMLElement.removeEventListener(event, callBack, boolean):
使用DOM2級事件綁定回調函數時,使用實名函數時,可以使用HTMLElement.removeEventListener(event, callBack, boolean)來移除對應的事件, event, callBack, boolean一個也不能變
兼容問題
在IE6~8瀏覽器中,我們不支持addEventListener/removeEventListener, 如果想實現DOM2事件綁定只能用attachEvent/detachEvent
它只有兩個參數,不能想addEventListener那樣控制在那個階段發生, 默認只能在冒泡階段發生
行為需要添加“on”,和DOM0特別類似
和標准瀏覽器的事件池機制對比:
- 順序問題:IE6~8執行的時候順序是混亂的,標准瀏覽器是按照綁定順序依次執行的
- 重復問題:IE6~8可以給同一個元素的同一個行為綁定多個相同的方法
- THIS問題:IE6~8中當方法執行的時候,THIS指向WINDOW,標准瀏覽器指向的當前的元素
DOM2事件機制
- 只能給某個元素的同一個行為綁定多個“不同”的方法(如果方法相同了只能保留一個)
- 當行為觸發,會按照綁定的先后順序依次把綁定的方法執行
- 執行的方法中的this是當前被綁定事件的元素本身
事件池
存儲當前元素行為綁定的方法