轉 js自定義事件——Event和CustomEvent


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

 

筆記只是我個人的理解,可能不是正確答案,如果有dalao發現我哪里說錯了,留言告訴我,大家一起學習一起進步嘛(o′▽`o)ノ


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM