91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用javascript實現自定義事件功能

發布時間:2022-05-11 13:49:29 來源:億速云 閱讀:131 作者:iii 欄目:安全技術

這篇文章主要介紹“怎么用javascript實現自定義事件功能”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么用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);
})

關于“怎么用javascript實現自定義事件功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰都县| 岑巩县| 黄龙县| 天祝| 通州市| 通化市| 南汇区| 清原| 沾化县| 穆棱市| 什邡市| 突泉县| 吉首市| 海淀区| 青岛市| 年辖:市辖区| 龙海市| 宁蒗| 政和县| 泉州市| 获嘉县| 民县| 新龙县| 琼结县| 马公市| 拉萨市| 南部县| 陇川县| 安化县| 章丘市| 寿阳县| 巧家县| 乌兰浩特市| 朔州市| 阳新县| 文安县| 湛江市| 宜兴市| 个旧市| 大港区| 鄄城县|