這篇文章主要介紹了javascript如何實現(xiàn)自定義事件功能,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站是一家專注于成都做網(wǎng)站、成都網(wǎng)站建設與策劃設計,南澗網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:南澗等地區(qū)。南澗做網(wǎng)站價格咨詢:18980820575概述
自定義事件很難派上用場?
為什么自定義事件很難派上用場,因為以前js不是模塊化開發(fā),也很少協(xié)作。因為事件本質是一種通信方式,是一種消息,只有存在多個對象,多個模塊的情況下,才有可能需要用到事件進行通信。而現(xiàn)在有了模塊化之后,已經(jīng)可以使用自定義事件進行各模塊間協(xié)作了。
哪里用得到自定義事件?
事件本質是一種消息,事件模式本質上是觀察者模式的實現(xiàn),那么用得上觀察者模式的地方,自然也可以也可以用上事件模式。所以,如果:
1、一個目標對象改變,需要多個觀察者調整自身的。
比如:我需要元素A點擊之后,元素B顯示鼠標的位置,元素C顯示提示,元素D.....
2、分模塊協(xié)作需要解耦的
比如:甲負責模塊A,乙負責模塊B,模塊B需要A運行完之后才能運行
傳統(tǒng)的寫法將邏輯寫在一個方法里面:
function doSomething(){ A(); B(); }
這樣做每次擴展都要修改a的點擊函數(shù),不好擴展。
自定義事件的寫法
//1、創(chuàng)建事件 var clickElem = new Event("clickElem"); //2、注冊事件監(jiān)聽器 elem.addEventListener("clickElem",function(e){ //干點事 }) //3、觸發(fā)事件 elem.dispatchEvent(clickElem);
可以看到,elem通過dispatchEvent方法觸發(fā)的事件,只有elem上注冊的監(jiān)聽器才能監(jiān)聽得到。這就很沒意思了,自己發(fā)給自己消息,通知自己去干什么。
創(chuàng)建自定義事件可參考: MDN : Creating_and_triggering_events
應用
從前面 js 自定義事件 的描述中知道:元素A通過dispatchEvent方法觸發(fā)的事件,只有A上注冊的監(jiān)聽器才能監(jiān)聽得到。
我們想要的效果是,別的對象干了某件事之后, 發(fā)個消息給我們,好讓我們能做相應的改變。要做到這樣,也不是沒辦法:我們可以在一個公共對象上監(jiān)聽和觸發(fā)事件,這就很有意義了。
例子一:通知多個對象
要實現(xiàn) 元素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"; })
這樣寫,三個模塊之間完全不用關心對象,也不知道對方存在,耦合度非常的低,完全可以獨立編寫,不會互相影響。這其實就是一個觀察者模式的實現(xiàn)。
例子二:游戲框架
要開發(fā)一個游戲,啟動游戲,加載圖片和音樂,加載完后,渲染場景和音效,加載和渲染由不同的人負責??梢赃@樣寫:
文件:index.js
import loadImage from "./loadImage" import loadMusic from "./loadMusic" import initScene from "./initScene" var start = document.getElementById("start"); start.addEventListener("click",function(e){ console.log("游戲開始!"); document.dispatchEvent(new Event("gameStart")); })
文件:loadImage.js
// 加載圖片 document.addEventListener("gameStart",function(){ console.log("加載圖片..."); setTimeout(function(){ console.log("加載圖片完成"); document.dispatchEvent(new Event("loadImageSuccess")); },1000); });
文件:loadMusic.js
//加載音樂 document.addEventListener("gameStart",function(){ console.log("加載音樂..."); setTimeout(function(){ console.log("加載音樂完成"); document.dispatchEvent(new Event("loadMusicSuccess")); },2000); });
文件:initScene.js
//渲染場景 document.addEventListener("loadImageSuccess",function(e){ console.log("使用圖片創(chuàng)建場景..."); setTimeout(function(){ console.log("創(chuàng)建場景完成"); },2000) }); //渲染音效 document.addEventListener("loadMusicSuccess",function(e){ console.log("使用音樂創(chuàng)建音效..."); setTimeout(function(){ console.log("創(chuàng)建音效完成"); },500) });
加載模塊和渲染模塊互不影響,易于擴展。
攜帶信息
除此之外,事件還能傳遞自定義信息:
var event = new CustomEvent('myEvent', { 'dataName': dataContent }); document.dispatchEvent(event);
(注意:傳遞自定義信息需要使用CustomEvent,而不是Event)
然后在監(jiān)聽函數(shù)里取出:
document.addEventListener("myEvent",function(e){ console.log(e.dataName); })
這個功能非常有用!
感謝你能夠認真閱讀完這篇文章,希望小編分享的“javascript如何實現(xiàn)自定義事件功能”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設計公司,關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道,更多相關知識等著你來學習!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、網(wǎng)站設計器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享文章:javascript如何實現(xiàn)自定義事件功能-創(chuàng)新互聯(lián)
當前路徑:http://muchs.cn/article48/dhgiep.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站策劃、關鍵詞優(yōu)化、移動網(wǎng)站建設、手機網(wǎng)站建設、品牌網(wǎng)站設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容