javascript自定義事件功能與用法實(shí)例分析
本文實(shí)例講述了javascript自定義事件功能與用法。分享給大家供大家參考,具體如下:
概述
自定義事件很難派上用場(chǎng)?
為什么自定義事件很難派上用場(chǎng),因?yàn)橐郧癹s不是模塊化開發(fā),也很少協(xié)作。因?yàn)槭录举|(zhì)是一種通信方式,是一種消息,只有存在多個(gè)對(duì)象,多個(gè)模塊的情況下,才有可能需要用到事件進(jìn)行通信。而現(xiàn)在有了模塊化之后,已經(jīng)可以使用自定義事件進(jìn)行各模塊間協(xié)作了。
哪里用得到自定義事件?
事件本質(zhì)是一種消息,事件模式本質(zhì)上是觀察者模式的實(shí)現(xiàn),那么用得上觀察者模式的地方,自然也可以也可以用上事件模式。所以,如果:
1、一個(gè)目標(biāo)對(duì)象改變,需要多個(gè)觀察者調(diào)整自身的。
比如:我需要元素A點(diǎn)擊之后,元素B顯示鼠標(biāo)的位置,元素C顯示提示,元素D.....
2、分模塊協(xié)作需要解耦的
比如:甲負(fù)責(zé)模塊A,乙負(fù)責(zé)模塊B,模塊B需要A運(yùn)行完之后才能運(yùn)行
傳統(tǒng)的寫法將邏輯寫在一個(gè)方法里面:
function doSomething(){
A();
B();
}
這樣做每次擴(kuò)展都要修改a的點(diǎn)擊函數(shù),不好擴(kuò)展。
自定義事件的寫法
//1、創(chuàng)建事件
var clickElem = new Event("clickElem");
//2、注冊(cè)事件監(jiān)聽器
elem.addEventListener("clickElem",function(e){
//干點(diǎn)事
})
//3、觸發(fā)事件
elem.dispatchEvent(clickElem);
可以看到,elem通過dispatchEvent方法觸發(fā)的事件,只有elem上注冊(cè)的監(jiān)聽器才能監(jiān)聽得到。這就很沒意思了,自己發(fā)給自己消息,通知自己去干什么。
創(chuàng)建自定義事件可參考: MDN : Creating_and_triggering_events
應(yīng)用
從前面 js 自定義事件 的描述中知道:元素A通過dispatchEvent方法觸發(fā)的事件,只有A上注冊(cè)的監(jiān)聽器才能監(jiān)聽得到。
我們想要的效果是,別的對(duì)象干了某件事之后, 發(fā)個(gè)消息給我們,好讓我們能做相應(yīng)的改變。要做到這樣,也不是沒辦法:我們可以在一個(gè)公共對(duì)象上監(jiān)聽和觸發(fā)事件,這就很有意義了。
例子一:通知多個(gè)對(duì)象
要實(shí)現(xiàn) 元素A點(diǎn)擊之后,元素B顯示鼠標(biāo)的位置,元素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進(jìn)來的變量雖然不使用,但是一定不能省略
文件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 = "你點(diǎn)了A";
})
這樣寫,三個(gè)模塊之間完全不用關(guān)心對(duì)象,也不知道對(duì)方存在,耦合度非常的低,完全可以獨(dú)立編寫,不會(huì)互相影響。這其實(shí)就是一個(gè)觀察者模式的實(shí)現(xiàn)。
例子二:游戲框架
要開發(fā)一個(gè)游戲,啟動(dòng)游戲,加載圖片和音樂,加載完后,渲染場(chǎng)景和音效,加載和渲染由不同的人負(fù)責(zé)??梢赃@樣寫:
文件: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
//渲染場(chǎng)景
document.addEventListener("loadImageSuccess",function(e){
console.log("使用圖片創(chuàng)建場(chǎng)景...");
setTimeout(function(){
console.log("創(chuàng)建場(chǎng)景完成");
},2000)
});
//渲染音效
document.addEventListener("loadMusicSuccess",function(e){
console.log("使用音樂創(chuàng)建音效...");
setTimeout(function(){
console.log("創(chuàng)建音效完成");
},500)
});
加載模塊和渲染模塊互不影響,易于擴(kuò)展。
攜帶信息
除此之外,事件還能傳遞自定義信息:
var event = new CustomEvent('myEvent', { 'dataName': dataContent });
document.dispatchEvent(event);
(注意:傳遞自定義信息需要使用CustomEvent,而不是Event)
然后在監(jiān)聽函數(shù)里取出:
document.addEventListener("myEvent",function(e){
console.log(e.dataName);
})
這個(gè)功能非常有用!
附:點(diǎn)擊此處查看github示例
PS:這里再為大家附上javascript系統(tǒng)自帶事件參考表供大家參考查詢:
javascript事件與功能說明大全:
http://tools.jb51.net/table/javascript_event
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript操作DOM技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript實(shí)現(xiàn)拖拽元素對(duì)齊到網(wǎng)格(每次移動(dòng)固定距離)
最近在做一個(gè)拖拽元素的附加功能,就是對(duì)齊到網(wǎng)格,實(shí)際上就是確定好元素的初始位置,然后拖拽元素時(shí),每次移動(dòng)固定的距離。讓元素都可以在網(wǎng)格內(nèi)對(duì)齊2016-11-11
Javascript實(shí)現(xiàn)從小到大的數(shù)組轉(zhuǎn)換成二叉搜索樹
這篇文章主要介紹了Javascript實(shí)現(xiàn)從小到大的數(shù)組轉(zhuǎn)換成二叉搜索樹的相關(guān)資料,需要的朋友可以參考下2017-06-06
javascript實(shí)現(xiàn)簡單小鋼琴有聲彈奏效果
用HTML5+javascript實(shí)現(xiàn)的小鋼琴,按下鋼琴鍵上的相應(yīng)字母用或用鼠標(biāo)點(diǎn)擊鋼琴鍵發(fā)聲,javascript代碼包含了對(duì)鼠標(biāo)按下、移動(dòng)和松開,以及鍵盤按下的事件監(jiān)聽2024-02-02
echarts動(dòng)態(tài)渲染柱狀圖背景顏色及頂部數(shù)值方法詳解
在使用echarts時(shí),有時(shí)需要給柱狀圖設(shè)置背景,下面這篇文章主要給大家介紹了關(guān)于echarts動(dòng)態(tài)渲染柱狀圖背景顏色及頂部數(shù)值的相關(guān)資料,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
基于JavaScript實(shí)現(xiàn)根據(jù)手機(jī)定位獲取當(dāng)前具體位置(X省X市X縣X街道X號(hào))
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)根據(jù)手機(jī)定位獲取當(dāng)前具體位置(X省X市X縣X街道X號(hào))的相關(guān)資料,需要的朋友可以參考下2015-12-12

