事件流
事件流描述的是從頁面中接收事件的順序。大家都知道,IE這傢伙就是搞特殊,於是出現了兩個版本,(不可忽視IE所帶來的積極的作用,哈哈)
- IE的事件冒泡流
- Netscape的事件捕獲流 實際上,這兩個就是我後來曉得的DOM事件流,在DOM2級事件中,規定了事件流包括了的三個階段,事件捕獲階段,處於目標階段,事件冒泡階段。(雖然DOM2中規定了事件從document開始,但大多數瀏覽器都是從window物件開始捕獲的,還有也規定也要求捕獲階段不會涉及事件目標,但大多數瀏覽器也都在捕獲階段觸發了物件上的事件,結果就是說,有兩個機會在目標物件上面操作事件)-參考JS高階程式設計 --圖片來自網路
事件處理程式
- HTML的事件處理程式,就是將js寫在HTML中
- DOM0級的事件處理程式
element.click = function(){}
- DOM2級的事件處理程式
element.addEventListTener('click',function(){},false)
最後一個布林引數代表是否在捕獲階段呼叫事件處理函式,一般為false,就是在冒泡階段呼叫這個事件處理函式IEelement.attachEvent('onclick',function(){})
(DOM2級的好處就是可以新增多個事件處理函式,但是如果想要呼叫removeEventListener來移除之前新增的事件,則需要將函式以函式變數的形式提取出來,只將函式名作為引數傳入)
someFun = function(){}
element.addEventListener('click',someFun,false)
element.removeEventListener('click',someFun,false)
複製程式碼
- DOM3級就是新添了很多時間,例如Keyup等
event事件物件
上面所說的事件的處理函式中,會有一個預設的event物件
element.click = function(event){
event.preventDefault() 取消事件的預設行為
event.stopPropagation() 取消事件的進一步的捕獲或者冒泡
event.stopImmediatePropagation() 取消事件的進一步的捕獲或者冒,同事阻止任務事件處理程式被呼叫,(就是加入這個元素繫結了兩個處理函式,使用這個會阻止另一個觸發)
event.currentTarget 事件繫結的那個元素上
event.target 當前點選的元素,它和上面那個大哥常用於事件委託優化
}
複製程式碼
自定義事件
var eve = new Event('test')
element.addEventListener('test',function(){})
觸發
element.dispatcher(eve)
複製程式碼
有的時候面試會問Event和CustomEvent的區別,就是後者可以攜帶引數
// create and dispatch the event
var event = new CustomEvent("cat", {
detail: {
hazcheeseburger: true
}
});
// add an appropriate event listener
obj.addEventListener("cat", function(e) {});
obj.dispatchEvent(event);
複製程式碼