国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

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

2024-05-06 16:40:47
字體:
來源:轉載
供稿:網友

本文實例講述了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";})

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

例子二:游戲框架

要開發一個游戲,啟動游戲,加載圖片和音樂,加載完后,渲染場景和音效,加載和渲染由不同的人負責。可以這樣寫:

文件: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("使用圖片創建場景...");  setTimeout(function(){    console.log("創建場景完成");  },2000)});//渲染音效document.addEventListener("loadMusicSuccess",function(e){  console.log("使用音樂創建音效...");  setTimeout(function(){    console.log("創建音效完成");  },500)});

加載模塊和渲染模塊互不影響,易于擴展。

攜帶信息

除此之外,事件還能傳遞自定義信息:

var event = new CustomEvent('myEvent', { 'dataName': dataContent });document.dispatchEvent(event);

(注意:傳遞自定義信息需要使用CustomEvent,而不是Event)

然后在監聽函數里取出:

document.addEventListener("myEvent",function(e){  console.log(e.dataName);})

這個功能非常有用!

附:點擊此處查看github示例

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏山县| 安龙县| 慈溪市| 宁武县| 五河县| 琼海市| 随州市| 乐亭县| 西昌市| 遵义县| 高密市| 吕梁市| 祁阳县| 清河县| 彰武县| 延吉市| 仙桃市| 南丰县| 东源县| 云安县| 长治县| 大安市| 天峨县| 芮城县| 沿河| 三台县| 利川市| 惠水县| 新泰市| 冕宁县| 嘉兴市| 西峡县| 静海县| 虎林市| 天水市| 区。| 尚志市| 兴仁县| 南和县| 彝良县| 蓬莱市|