成熟丰满熟妇高潮XXXXX,人妻无码AV中文系列久久兔费 ,国产精品一国产精品,国精品午夜福利视频不卡麻豆

您好,歡迎來到九壹網(wǎng)。
搜索
您的當(dāng)前位置:首頁javascript自定義事件功能與用法實例分析

javascript自定義事件功能與用法實例分析

來源:九壹網(wǎng)

本文實例講述了javascript自定義事件功能與用法。分享給大家供大家參考,具體如下:

概述

自定義事件很難派上用場?

為什么自定義事件很難派上用場,因為以前js不是模塊化開發(fā),也很少協(xié)作。因為事件本質(zhì)是一種通信方式,是一種消息,只有存在多個對象,多個模塊的情況下,才有可能需要用到事件進行通信。而現(xiàn)在有了模塊化之后,已經(jīng)可以使用自定義事件進行各模塊間協(xié)作了。

哪里用得到自定義事件?

事件本質(zhì)是一種消息,事件模式本質(zhì)上是觀察者模式的實現(xiàn),那么用得上觀察者模式的地方,自然也可以也可以用上事件模式。所以,如果:

1、一個目標(biāo)對象改變,需要多個觀察者調(diào)整自身的。

比如:我需要元素A點擊之后,元素B顯示鼠標(biāo)的位置,元素C顯示提示,元素D.....

2、分模塊協(xié)作需要解耦的

比如:甲負責(zé)模塊A,乙負責(zé)模塊B,模塊B需要A運行完之后才能運行

傳統(tǒng)的寫法將邏輯寫在一個方法里面:

function doSomething(){
 A();
 B();
}

這樣做每次擴展都要修改a的點擊函數(shù),不好擴展。

自定義事件的寫法

//1、創(chuàng)建事件
var clickElem = new Event("clickElem");
//2、注冊事件
elem.addEventListener("clickElem",function(e){
 //干點事
})
//3、觸發(fā)事件
elem.dispatchEvent(clickElem);

可以看到,elem通過dispatchEvent方法觸發(fā)的事件,只有elem上注冊的才能監(jiān)聽得到。這就很沒意思了,自己發(fā)給自己消息,通知自己去干什么。

創(chuàng)建自定義事件可參考: MDN : Creating_and_triggering_events

應(yīng)用

從前面 js 自定義事件 的描述中知道:元素A通過dispatchEvent方法觸發(fā)的事件,只有A上注冊的才能監(jiān)聽得到。

我們想要的效果是,別的對象干了某件事之后, 發(fā)個消息給我們,好讓我們能做相應(yīng)的改變。要做到這樣,也不是沒辦法:我們可以在一個公共對象上監(jiān)聽和觸發(fā)事件,這就很有意義了。

例子一:通知多個對象

要實現(xiàn) 元素A點擊之后,元素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進來的變量雖然不使用,但是一定不能省略

文件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";
})

這樣寫,三個模塊之間完全不用關(guān)心對象,也不知道對方存在,耦合度非常的低,完全可以編寫,不會互相影響。這其實就是一個觀察者模式的實現(xiàn)。

例子二:游戲框架

要開發(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

//渲染場景
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);
})

這個功能非常有用!

附:點擊此處查看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錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)算用法總結(jié)》

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號-2

違法及侵權(quán)請聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市萬商天勤律師事務(wù)所王興未律師提供法律服務(wù)