日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Javascript自定义事件功能与用法实例分析

發布時間:2025/7/14 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javascript自定义事件功能与用法实例分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:https://www.jb51.net/article/127776.htm

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

概述

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

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

哪里用得到自定義事件?

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

1、一個目標對象改變,需要多個觀察者調整自身的。

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

2、分模塊協作需要解耦的

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

傳統的寫法將邏輯寫在一個方法里面:

?
1 2 3 4 function doSomething(){ ??A(); ??B(); }

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

自定義事件的寫法

?
1 2 3 4 5 6 7 8 //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

?
1 2 3 4 5 6 7 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:

?
1 2 3 4 var b = document.getElementById("b"); document.addEventListener("clickA",function(e){ ??b.innerHTML = "(128,345)"; })

文件c.js:

?
1 2 3 4 var c = document.getElementById("c"); document.addEventListener("clickA",function(e){ ??c.innerHTML = "你點了A"; })

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

例子二:游戲框架

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

文件:index.js

?
1 2 3 4 5 6 7 8 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

?
1 2 3 4 5 6 7 8 // 加載圖片 document.addEventListener("gameStart",function(){ ??console.log("加載圖片..."); ??setTimeout(function(){ ????console.log("加載圖片完成"); ????document.dispatchEvent(new Event("loadImageSuccess")); ??},1000); });

文件:loadMusic.js

?
1 2 3 4 5 6 7 8 //加載音樂 document.addEventListener("gameStart",function(){ ??console.log("加載音樂..."); ??setTimeout(function(){ ????console.log("加載音樂完成"); ????document.dispatchEvent(new Event("loadMusicSuccess")); ??},2000); });

文件:initScene.js

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 //渲染場景 document.addEventListener("loadImageSuccess",function(e){ ??console.log("使用圖片創建場景..."); ??setTimeout(function(){ ????console.log("創建場景完成"); ??},2000) }); //渲染音效 document.addEventListener("loadMusicSuccess",function(e){ ??console.log("使用音樂創建音效..."); ??setTimeout(function(){ ????console.log("創建音效完成"); ??},500) });

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

攜帶信息

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

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

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

然后在監聽函數里取出:

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

這個功能非常有用!

附:點擊此處查看github示例

PS:這里再為大家附上javascript系統自帶事件參考表供大家參考查詢:

javascript事件與功能說明大全:
http://tools.jb51.net/table/javascript_event

轉載于:https://www.cnblogs.com/boonya/p/11165024.html

總結

以上是生活随笔為你收集整理的Javascript自定义事件功能与用法实例分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。