摘要:介紹自定義事件之前,首先要介紹一種設(shè)計模式觀察者模式。自定義事件背后的概念是創(chuàng)建一個管理事件的對象,讓其他對象監(jiān)聽這些事件。問自定義事件的認(rèn)知邏輯是什么答咳咳應(yīng)該是觀察者模式吧,能力有限,具體的描述以后補(bǔ)上。
介紹自定義事件之前,首先要介紹一種設(shè)計模式--觀察者模式。
事件是一種叫做觀察者的設(shè)計模式,是一種創(chuàng)建松散耦合代碼的技術(shù)。
觀察者模式有兩類對象組成:主體和觀察者。主體負(fù)責(zé)發(fā)布事件,來表示該對象聲明周期某些有趣的時刻到了;觀察者通過監(jiān)聽這些事件來觀察該主體,等待某些有趣的時刻到來,并運行代碼來響應(yīng)。
該模式的一個關(guān)鍵概念是主體并不知道觀察者的任何事情,也就是說他可以獨立存在并正常運轉(zhuǎn),即時觀察者不存在。
舉個例子,政府發(fā)布某個文件,下面部門根據(jù)文件執(zhí)行相應(yīng)的任務(wù)。政府為主體,執(zhí)行人為觀察者。但是政府并不知道具體執(zhí)行這件事的人是誰,甚至都不知道是不是有人在執(zhí)行,就好像政府讓下面的人對老城區(qū)拆遷改造但是并不知道他們會強(qiáng)拆一樣,但這并不影響政府發(fā)布文件。
涉及到DOM上,DOM元素便是主體,你的事件處理程序(即回調(diào)函數(shù))便是觀察者。
自定義事件背后的概念是創(chuàng)建一個管理事件的對象,讓其他對象監(jiān)聽這些事件。具體步驟如下:
定義事件管理對象的構(gòu)造函數(shù)--EventTarget,EventTarget類型有一個屬性和三個方法:
屬性--handlers:用于存儲事件處理程序
方法1--addHandler():用于對給定事件類型注冊事件處理程序
方法2--fire(): 用于觸發(fā)給定事件
方法3--removeEvent():用于注銷給定事件類型的事件處理程序
創(chuàng)建一個EventTarget類型的事件管理對象
通過addHandler()添加一個事件管理程序
通過fire()激發(fā)該事件
通過removeEvent()注銷該事件
代碼如下:
//定義事件管理對象的構(gòu)造函數(shù)--`EventTarget` function EventTarget(){ this.handlers = {}; } EventTarget.prototype = { constructor:EventTarget, /* 用于對給定事件類型注冊事件處理程序 param:事件類型--type;用于處理該事件的函數(shù)--handler */ addHandler:function(type,handler){ if(typeof this.handlers[type] == "undefined"){//若不存在針對該事件的數(shù)組,則創(chuàng)建一個新數(shù)組 this.handlers[type] = []; } this.handlers[type].push(handler);//將處理程序添加到數(shù)組中,同一事件可以有多個事件處理程序 }, /* 用于觸發(fā)給定事件 param:{} 至少包含type屬性 */ fire:function(event){ if(!event.target){ event.target = this; } if(this.handlers[event.type] instanceof Array){ var handlers = this.handlers[event.type]; for(var i = 0; i < handlers.length; i++){ handlers[i](event); } } }, /* 用于注銷給定事件類型的事件處理程序 param:事件類型--type;用于處理該事件的函數(shù)--handler */ removeHandler:function(type,handler){ if(this.handlers[type] instanceof Array){ var handlers = this.handlers[type]; for(var i = 0; i < handlers.length; i++){ if(handlers[i] === handler){ break; } } handlers.splice(i,1); } } }; function handleMessage(event){ alert("Message received:" + event.message); } //創(chuàng)建事件管理對象 var target = new EventTarget(); //添加事件執(zhí)行程序 target.addHandler("message",handleMessage); //觸發(fā)message事件 target.fire({type:"message",message:"Hello World"});//Message received:Hello World //注銷事件執(zhí)行程序 target.removeHandler("message",handleMessage); //再次觸發(fā)message事件 target.fire({type:"message",message:"Hello World"});//無警告框
思考:
寧向東老師在得到專欄說過:相比于認(rèn)知能力,擁有知識的數(shù)量的多少,并不重要,真正重要的是在學(xué)習(xí)一門知識的同時,要格外的在意這些知識所傳達(dá)出來的認(rèn)知邏輯。問:自定義事件的認(rèn)知邏輯是什么?
答:咳咳...應(yīng)該是觀察者模式吧,能力有限,具體的描述以后補(bǔ)上。
若理解有誤,敬請斧正
詳情請見js高程第22章--高級技巧
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95670.html
摘要:寫文章不容易,點個贊唄兄弟專注源碼分享,文章分為白話版和源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺得排版難看,請點擊下面鏈接或者拉到下面關(guān)注公眾號也可以吧原理白話版事件是我最感興趣的東西之 寫文章不容易,點個贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于...
摘要:首先來看看什么是自定義事件讓函數(shù)能夠具備事件的某些特性。其實自定義事件在一些主流的類庫中都有實現(xiàn),后續(xù)會分析具體的實現(xiàn)方法。今天,我們就先用簡單的例子來實現(xiàn)自定義事件的功能。 在團(tuán)隊協(xié)作的很多情況下,某個js的函數(shù)會根據(jù)不斷增加的需求進(jìn)而不斷增加功能,如果功能需求累積過多,我們就很難把控自己在這個函數(shù)中新定義的變量會不會覆蓋掉之前的定義。如: function action(){ ...
摘要:寫文章不容易,點個贊唄兄弟專注源碼分享,文章分為白話版和源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺得排版難看,請點擊下面鏈接或者拉到下面關(guān)注公眾號也可以吧原理源碼版之綁定組件自定義事件組件 寫文章不容易,點個贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于...
摘要:觸發(fā)事件可以攜帶數(shù)據(jù),這些數(shù)據(jù)被用于傳遞給綁定了事件的其它組件的回調(diào)函數(shù)上,進(jìn)而被傳遞給其它組件。父組件可以在回調(diào)函數(shù)里做任何事情,頗有靈活性。一般情況下,父組件會在回調(diào)函數(shù)中更新自己的狀態(tài)數(shù)據(jù)。 上一篇博文梳理了vue的數(shù)據(jù)驅(qū)動和響應(yīng)式相關(guān)的特性,這一篇博文就來梳理vue的一個很重要的特性,組件化。自定義組件之于vue,其意義不亞于函數(shù)之于C,java之類的編程語言。函數(shù)是計算機(jī)科學(xué)...
摘要:事件的綁定和解綁的多事件綁定之前學(xué)的鼠標(biāo)事件,表單事件與鍵盤事件都有個特點,就是直接給元素綁定一個處理函數(shù),所有這類事件都是屬于快捷處理。由于瀏覽器事件冒泡特性,可以在觸發(fā)時把這個事件往上冒泡到上,因為上綁定事件響應(yīng),所以能觸發(fā)這個動作。 事件的綁定和解綁 on()的多事件綁定 之前學(xué)的鼠標(biāo)事件,表單事件與鍵盤事件都有個特點,就是直接給元素綁定一個處理函數(shù),所有這類事件都是屬于快捷處理...
摘要:并沒有這個事件,那就用到了自定義事件這個東西了。先看看自定義事件在中的代碼自定義事件名稱是否冒泡是否可以停止捕獲上面整個的代碼,做了一個兼容性的處理。觸發(fā)自定義事件上面是滿足頻率后就出發(fā)自定義的事件這就是觸發(fā)事件的方法。 shakejs是一個搖一搖的工具 gitHub : https://github.com/alexgibson/shake.js 使用方法 //引入 初始化...
閱讀 3755·2021-09-22 10:57
閱讀 1924·2019-08-30 15:55
閱讀 2715·2019-08-30 15:44
閱讀 1744·2019-08-30 15:44
閱讀 1888·2019-08-30 15:44
閱讀 2259·2019-08-30 12:49
閱讀 1063·2019-08-29 18:47
閱讀 3144·2019-08-29 16:15