之前在學習自定義事件時,在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

