之前在學習自定義事件時,在MDN的Event.initEvent()頁面頂端有寫:該特性已從Web標准中刪除,雖然一些瀏覽器目前仍然支持它,但也許會在未來的某個時間停止支持,請盡量不要使用該特性。
作為替代,我們可以通過創建Event對象和CustomEvent對象來創建自定義對象。先從Event()對象開始。
Event()——Event對象的構造函數
咱們可以看着下面這個例子去了解如何使用Event()創建一個自定義對象:
1 <script type="text/javascript"> 2 /* 創建一個事件對象,名字為newEvent,類型為build */ 3 var newEvent = new Event('build', { bubbles:true,cancelable:true,composed:true }); 4 5 /* 給這個事件對象創建一個屬性並賦值 */ 6 newEvent.name = "新的事件!"; 7 8 /* 將自定義事件綁定在document對象上,這里綁定的事件要和我們創建的事件類型相同,不然無法觸發 */ 9 document.addEventListener("build",function(){ 10 alert("你觸發了自定義事件!" + newEvent.name); 11 },false) 12 13 /* 觸發自定義事件 */ 14 document.dispatchEvent(newEvent); 15 </script>
啟動文檔的時候因為"document.dispatchEvent(newEvent)"的關系,會先觸發一次事件:
之后你每執行一次"document.dispatchEvent(newEvent)"都會觸發這個事件:
好,接下來我們看看Event()這個方法的語法把(disapthEvent()在我的另一個筆記里有介紹,這里就不再次介紹了):
event = new Event(typeArg, eventInit);
typeArg:指定事件類型,傳遞一個字符串。這里的事件類型指的是像點擊事件(click)、提交事件(submit)、加載事件(load)等等。
eventInit:可選,傳遞EventInit類型的字典。實際上這個EventInit類型的字典也就是我們使用InitEvent()時需要傳遞的參數,以鍵值對的形式傳遞,不過它可以多選一個參數:
bubbles:事件是否支持冒泡,傳遞一個boolean類型的參數,默認值為false。
cancelable:是否可取消事件的默認行為,傳遞一個boolean類型的參數,默認值為false。
composed:事件是否會觸發shadow DOM(陰影DOM)根節點之外的事件監聽器,傳遞一個boolean類型的參數,默認值為false。(關於shadow DOM可以去看ChokCoco前輩的這篇文章,這里就不詳說了,可能我會根據自己的理解也寫一個關於shadow DOM的筆記)這個參數是InitEvent()中沒有的新參數。
用法其實和使用createEvent()結合initEvent()差不多,不過Event()不支持IE瀏覽器,所以怎么使用還是得看咱們。
CustomEvent()——CustomEvent對象的構造函數
CustomEvent()可以像Event()那樣賦值,但它可以在Web Workers中使用(與主線程分離的另一個線程),可以傳遞跟事件關聯的相關值(detail)。(但我賊Event()中沒看到又說可不可以使用Web Workers,寫完這個去查查)
我們先通過下面的例子了解一下如何使用CustomEvent()去創建一個事件對象(這里先不使用事件相關值detail):
1 <script type="text/javascript"> 2 /* 創建一個事件對象,名字為newEvent,類型為build */ 3 var newEvent = new CustomEvent('build', { bubbles:true,cancelable:true,composed:true }); 4 5 /* 給這個事件對象創建一個屬性並賦值,這里綁定的事件要和我們創建的事件類型相同,不然無法觸發 */ 6 newEvent.name = "新的事件!"; 7 8 /* 將自定義事件綁定在document對象上 */ 9 document.addEventListener("build",function(){ 10 alert("你觸發了使用CustomEvent創建的自定義事件!" + newEvent.name); 11 },false) 12 13 /* 觸發自定義事件 */ 14 document.dispatchEvent(newEvent); 15 </script>
啟動文檔的時候因為"document.dispatchEvent(newEvent)"的關系,會先觸發一次事件:
之后你每執行一次"document.dispatchEvent(newEvent)"都會觸發這個事件:
然后我們來看CustomEvent()的語法:
event = new CustomEvent(typeArg, customEventInit);
typeArg:指定事件類型,傳遞一個字符串。這里的事件類型指的是像點擊事件(click)、提交事件(submit)、加載事件(load)等等。
customEventInit:可選。傳遞一個CustomEventInit字典。實際上這個字典就是我們使用initCustomEvent()時需要的參數,這個參數就是事件相關值(detail):
detail:可選,默認值為null,類型為any(也就是說可以傳遞任意類型的參數)。這個值就是和事件相關聯的值。
在展示使用detail作為第二個參數的例子前,要先注意一件事:CustomEventInit字典也可以接受EventInit字典的參數,就像一開始的例子一樣,我傳遞了EventInit字典的bubbles、cancelable、composed。
下面將展示使用detail參數的例子,使用到detail的部分我會加粗處理(為了看着方便,這回就不傳遞EventInit字典中的參數了):
1 <script type="text/javascript"> 2 /* 創建一個事件對象,名字為newEvent,類型為build */ 3 var newEvent = new CustomEvent('build',{ 4 detail: { 5 dog:"wo",cat:"mio" 6 } 7 }); 8 9 /* 將自定義事件綁定在document對象上 */ 10 document.addEventListener("build",function(){ 11 alert(" event.detail.dog:" + event.detail.dog 12 + "\n event.detail.cat:" + event.detail.cat ); 13 },false) 14 15 /* 觸發自定義事件 */ 16 document.dispatchEvent(newEvent); 17 </script>
啟動文檔的時候因為"document.dispatchEvent(newEvent)"的關系,會先觸發一次事件:
之后你每執行一次"document.dispatchEvent(newEvent)"都會觸發這個事件:
參考資料:
MDN - 創建和觸發Event:https://developer.mozilla.org/zh-CN/docs/Web/Guide/Events/Creating_and_triggering_events
MDN - Event():https://developer.mozilla.org/zh-CN/docs/Web/API/Event/Event
MDN - CustomEvent():https://developer.mozilla.org/zh-CN/docs/Web/API/CustomEvent/CustomEvent
MDN - CustomEvent.initCustomEvent():https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/initCustomEvent
MDN - CustomEvent.detail:https://developer.mozilla.org/zh-CN/docs/Web/API/CustomEvent/detail