本文實例講述了javascript自定義事件功能與用法。分享給大家供大家參考,具體如下:
概述
自定義事件很難派上用場?
為什么自定義事件很難派上用場,因為以前js不是模塊化開發,也很少協作。因為事件本質是一種通信方式,是一種消息,只有存在多個對象,多個模塊的情況下,才有可能需要用到事件進行通信。而現在有了模塊化之后,已經可以使用自定義事件進行各模塊間協作了。
哪里用得到自定義事件?
事件本質是一種消息,事件模式本質上是觀察者模式的實現,那么用得上觀察者模式的地方,自然也可以也可以用上事件模式。所以,如果:
1、一個目標對象改變,需要多個觀察者調整自身的。
比如:我需要元素A點擊之后,元素B顯示鼠標的位置,元素C顯示提示,元素D.....
2、分模塊協作需要解耦的
比如:甲負責模塊A,乙負責模塊B,模塊B需要A運行完之后才能運行
傳統的寫法將邏輯寫在一個方法里面:
function doSomething(){ A(); B();}這樣做每次擴展都要修改a的點擊函數,不好擴展。
自定義事件的寫法
//1、創建事件var clickElem = new Event("clickElem");//2、注冊事件監聽器elem.addEventListener("clickElem",function(e){ //干點事})//3、觸發事件elem.dispatchEvent(clickElem);可以看到,elem通過dispatchEvent方法觸發的事件,只有elem上注冊的監聽器才能監聽得到。這就很沒意思了,自己發給自己消息,通知自己去干什么。
創建自定義事件可參考: MDN : Creating_and_triggering_events
應用
從前面 js 自定義事件 的描述中知道:元素A通過dispatchEvent方法觸發的事件,只有A上注冊的監聽器才能監聽得到。
我們想要的效果是,別的對象干了某件事之后, 發個消息給我們,好讓我們能做相應的改變。要做到這樣,也不是沒辦法:我們可以在一個公共對象上監聽和觸發事件,這就很有意義了。
例子一:通知多個對象
要實現 元素A點擊之后,元素B顯示鼠標的位置,元素C顯示提示,可以這樣寫:
文件:a.js
import b from "./b"import c from "./c"var a = document.getElementById("a");a.addEventListener("click",function(e){ var clickA = new Event("clickA"); document.dispatchEvent(clickA);});注意:import進來的變量雖然不使用,但是一定不能省略
文件b.js:
var b = document.getElementById("b");document.addEventListener("clickA",function(e){ b.innerHTML = "(128,345)";})文件c.js:
var c = document.getElementById("c");document.addEventListener("clickA",function(e){ c.innerHTML = "你點了A";})
新聞熱點
疑難解答
圖片精選