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