自定義事件的觸發
又是不可避免的,由於瀏覽器兼容性問題,我們要分開說了,針對標准瀏覽器和IE6/7等考古瀏覽器。
1. 對於標准瀏覽器,其提供了可供元素觸發的方法:element.dispatchEvent()
. 不過,在使用該方法之前,我們還需要做其他兩件事,及創建和初始化。因此,總結說來就是:
1 document.createEvent() 2 event.initEvent() 3 element.dispatchEvent()
1 舉個例子: 2 3 var dom = document.querySelector('#id') 4 document.addEventListener('alert', function (event) { 5 console.log(event) 6 }, false); 7 8 // 創建 9 var evt = document.createEvent("HTMLEvents"); 10 // 初始化 11 evt.initEvent("alert", false, false); 12 13 // 觸發, 即彈出文字 14 dom.dispatchEvent(evt);
1 例子2: 2 3 let point = document.querySelector('#id'); 4 5 const e = document.createEvent('MouseEvents'); // 創建 6 7 e.initEvent('click', true, true); // 初始化,阻止冒泡,阻止原生事件 8 9 e.customId = point.id; // 設置Id 10 11 point.dispatchEvent(e); //觸發
createEvent()
方法返回新創建的Event
對象,支持一個參數,表示事件類型,具體見下表:
參數 | 事件接口 | 初始化方法 |
---|---|---|
HTMLEvents | HTMLEvent | initEvent() |
MouseEvents | MouseEvent | initMouseEvent() |
UIEvents | UIEvent | initUIEvent() |
關於createEvent()
方法我自己了解也不是很深入,不想濫竽充數,誤人子弟,所以您有疑問我可能作答不了,希望對熟知該方法的人可以做進一步的解釋說明(例如事件接口與document
關系,UIEvent
是什么東西等)。
initEvent()
方法用於初始化通過DocumentEvent
接口創建的Event
的值。
支持三個參數:initEvent(eventName, canBubble, preventDefault)
. 分別表示事件名稱,是否可以冒泡,是否阻止事件的默認操作。
dispatchEvent()
就是觸發執行了,dom.dispatchEvent(eventObject)
, 參數eventObject
表示事件對象,是createEvent()
方法返回的創建的Event
對象。
2. 對於IE瀏覽器,由於向下很多版本的瀏覽器都不支持document.createEvent()
方法,因此我們需要另辟蹊徑(據說IE有document.createEventObject()
和event.fireEvent()
方法,但是不支持自定義事件~~)。
IE瀏覽器有不少自給自足的東西,例如下面要說的這個"propertychange"
事件,顧名思意,就是屬性改變即觸發的事件。例如文本框value
值改變,或是元素id
改變,或是綁定的事件改變等等。
我們可以利用這個IE私有的東西實現自定義事件的觸發,大家可以先花幾分鍾想想……
// zxx: 假設幾分鍾已經過去了……
大家現在有思路了沒?其實說穿了很簡單,當我們添加自定義事件的時候,順便給元素添加一個自定義屬性即可。例如,我們添加自定義名為"alert"
的自定義事件,順便我們可以對元素做點小手腳:
1 dom.evtAlert = "2012-04-01";
再順便把自定義事件fn
塞到"propertychange"
事件中:
1 dom.attachEvent("onpropertychange", function(e) { 2 if (e.propertyName == "evtAlert") { 3 fn.call(this); 4 } 5 });
這個,當我們需要觸發自定義事件的時候,只要修改DOM上自定義的evtAlert
屬性的值即可:
1 dom.evtAlert = Math.random(); // 值變成隨機數
此時就會觸發dom
上綁定的onpropertychange
事件,又因為修改的屬性名正好是"evtAlert"
, 於是自定義的fn
就會被執行。這就是IE瀏覽器下事件觸發實現的完整機制,應該說講得還是蠻細的。
自定義事件的刪除
與觸發事件不同,事件刪除,各個瀏覽器都提供了對於的時間刪除方法,如removeEventListener
和detachEvent
。不過呢,對於IE瀏覽器,還要多刪除一個事件,就是為了實現觸發功能額外增加的onpropertychange
事件:
1 dom.detachEvent("onpropertychange", evt);