<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 22:25:47
        文檔

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

        javascript自定義事件功能與用法實例分析:本文實例講述了javascript自定義事件功能與用法。分享給大家供大家參考,具體如下: 概述 自定義事件很難派上用場? 為什么自定義事件很難派上用場,因為以前js不是模塊化開發,也很少協作。因為事件本質是一種通信方式,是一種消息,只有存在多個對象,多個
        推薦度:
        導讀javascript自定義事件功能與用法實例分析:本文實例講述了javascript自定義事件功能與用法。分享給大家供大家參考,具體如下: 概述 自定義事件很難派上用場? 為什么自定義事件很難派上用場,因為以前js不是模塊化開發,也很少協作。因為事件本質是一種通信方式,是一種消息,只有存在多個對象,多個

        本文實例講述了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示例

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

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

        更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript事件相關操作與技巧大全》、《JavaScript操作DOM技巧總結》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

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

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        javascript自定義事件功能與用法實例分析:本文實例講述了javascript自定義事件功能與用法。分享給大家供大家參考,具體如下: 概述 自定義事件很難派上用場? 為什么自定義事件很難派上用場,因為以前js不是模塊化開發,也很少協作。因為事件本質是一種通信方式,是一種消息,只有存在多個對象,多個
        推薦度:
        標簽: 使用 js 例子
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 无遮挡呻吟娇喘视频免费播放| 亚洲日韩中文无码久久| 亚洲日本人成中文字幕| 91热成人精品国产免费| 亚洲精品中文字幕麻豆| 亚洲精品国产免费| 亚洲乱码一二三四五六区| 日韩一区二区a片免费观看| 亚洲人成人网毛片在线播放| 成人免费午夜无码视频| 亚洲综合一区无码精品| 日韩成人免费aa在线看| 鲁啊鲁在线视频免费播放| 亚洲国产精品狼友中文久久久 | 免费又黄又硬又爽大片| 深夜a级毛片免费视频| 国产专区一va亚洲v天堂| 巨胸狂喷奶水视频www网站免费| 国产亚洲老熟女视频| 三年片在线观看免费观看大全一| 亚洲VA中文字幕不卡无码| 在线观看www日本免费网站| 亚洲一区二区三区丝袜| 亚洲а∨天堂久久精品| 国产成人精品无码免费看 | 在线亚洲高清揄拍自拍一品区| 无码中文字幕av免费放| 国产亚洲福利精品一区二区| 亚洲精品午夜国产VA久久成人| 国产白丝无码免费视频| 亚洲日韩国产AV无码无码精品| 国产一区二区三区在线观看免费 | 亚洲第一区香蕉_国产a| 国产1024精品视频专区免费| 精品视频免费在线| 久久久综合亚洲色一区二区三区| 久久狠狠躁免费观看| 亚洲av无码专区国产不乱码| 亚洲日韩精品一区二区三区无码 | 又爽又黄无遮挡高清免费视频 | 国产大片91精品免费观看不卡|