自定義事件——Event和CustomEvent

 

  以前在學習自定義事件時,在MDN的Event.initEvent()頁面頂端有寫:該特性已從Web標準中刪除,雖然一些瀏覽器目前仍然支持它,但也許會在將來的某個時間中止支持,請儘可能不要使用該特性。javascript

  做爲替代,咱們能夠經過建立Event對象和CustomEvent對象來建立自定義對象。先從Event()對象開始。html

  

Event()——Event對象的構造函數java

  

  我們能夠看着下面這個例子去了解如何使用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)"的關係,會先觸發一次事件:ide

  

  以後你每執行一次"document.dispatchEvent(newEvent)"都會觸發這個事件:函數

  

  好,接下來咱們看看Event()這個方法的語法把(disapthEvent()在個人另外一個筆記裏有介紹,這裏就再也不次介紹了):學習

  event = new Event(typeArg, eventInit);ui

  typeArg:指定事件類型,傳遞一個字符串。這裏的事件類型指的是像點擊事件(click)、提交事件(submit)、加載事件(load)等等。spa

  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

相關文章
相關標籤/搜索