摘要:事件定義事件是與交互的最常見(jiàn)的方式但它也可以用于非代碼中通過(guò)實(shí)現(xiàn)自定義事件實(shí)現(xiàn)自定義事件的原理是創(chuàng)建一個(gè)管理事件的對(duì)象如下代碼是事件的定義存儲(chǔ)事件處理程序由個(gè)鍵值對(duì)組成鍵表示事件名值是一個(gè)由事件處理程序組成的數(shù)組添加事件觸發(fā)事件將傳遞給
事件定義
事件是與DOM交互的最常見(jiàn)的方式,但它也可以用于非DOM代碼中--通過(guò)實(shí)現(xiàn)自定義事件.實(shí)現(xiàn)自定義事件的原理是創(chuàng)建一個(gè)管理事件的對(duì)象.如下代碼是事件的定義:
function EventTarget(){ this.handlers = {};//存儲(chǔ)事件處理程序,由n個(gè)鍵值對(duì)組成,鍵表示事件名,值是一個(gè)由事件處理程序組成的數(shù)組 } EventTarget.prototype = { constructor:EventTarget, //添加事件 addHandler:function(type,handler){ if(typeof this.handlers[type] == "undefined"){ this.handlers[type] = []; } this.handlers[type].push(handler); }, //觸發(fā)事件 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,len=handlers.length;i < len;i++){ //將event傳遞給事件處理程序,event.target代表對(duì)象本身, event.type代表事件名,你可以根據(jù)情況為添加event屬性 handlers[i](event); } } }, //移除事件 removeHandler:function(type,handler){ if(this.handlers[type] instanceof Array){ var handlers=this.handlers[type]; for(var i=0,len=handlers.length;i < len; i++){ if(handlers[i] == handler){ break; } } handlers.splice(i,1); } } };
首先是定義了一個(gè)名為EventTarget的構(gòu)造函數(shù),為其定義的屬性handlers用于存儲(chǔ)事件處理程序,
然后有三個(gè)操作方法添加到EventTarget的原型中,分別是addHandler fire remocveHander.
addHander是向handlers中添加事件處理程序
fire是觸發(fā)handlers中的事件處理程序
removeHandler是向handlers中移除事件處理程序
注:事件處理程序通俗的講就是事件被觸發(fā)時(shí)需要執(zhí)行的方法.
var eventObj=new EventTarget(); //實(shí)例化一個(gè)EventTarget類(lèi)型 var handler=function(){ alert("event"); }; //事件處理程序 eventObj.addHandler("alert",handler); //為eventObj對(duì)象添加一個(gè)事件處理程序`handler` event.fire({type:"alert"}); //觸發(fā)eventObj對(duì)象中的事件處理程序`handler` event.removeHandler("alert",handler); //刪除eventObj對(duì)象中的事件處理程序`handler`事件繼承
當(dāng)然我們也可以通過(guò)繼承讓其他引用類(lèi)型繼承EventTarget的屬性和方法.
//原型式繼承 var object=function(o){ function F(){} F.prototype=o; return new F(); }; //subType繼承superType的原型對(duì)象 var inheritPrototype=function(subType,superType){ var prototype=object(superType.prototype); prototype.constructor=subType; subType.prototype=prototype; } function Person(name,age){ EventTarget.call(this);//繼承EventTarget的屬性 this.name = name; this.age = age; } inheritPrototype(Person,EventTarget);//繼承EventTarget的方法 Person.prototype.say=function(message){ this.fire({type:"message",message:message}); //觸發(fā)事件 }; //事件處理程序 var handMessage=function(event){ alert(event.target.name + "says:" + event.message); }; var person=new Person("yhlf",29); person.addHandler("message",handMessage); person.say("Hi there");
使用自定義事件有助于解耦相關(guān)對(duì)象,保持功能的隔絕,在很多情況下,觸發(fā)事件的代碼和監(jiān)聽(tīng)事件的代碼是完全分離的.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85990.html
摘要:首先來(lái)看看什么是自定義事件讓函數(shù)能夠具備事件的某些特性。其實(shí)自定義事件在一些主流的類(lèi)庫(kù)中都有實(shí)現(xiàn),后續(xù)會(huì)分析具體的實(shí)現(xiàn)方法。今天,我們就先用簡(jiǎn)單的例子來(lái)實(shí)現(xiàn)自定義事件的功能。 在團(tuán)隊(duì)協(xié)作的很多情況下,某個(gè)js的函數(shù)會(huì)根據(jù)不斷增加的需求進(jìn)而不斷增加功能,如果功能需求累積過(guò)多,我們就很難把控自己在這個(gè)函數(shù)中新定義的變量會(huì)不會(huì)覆蓋掉之前的定義。如: function action(){ ...
摘要:我們就需要我們自己去定義事件其實(shí)就是我們寫(xiě)的函數(shù),尤其是組件開(kāi)發(fā)過(guò)程中,用的尤為多??赡苡写_定按鈕取消按鈕等操作。但是自定義事件的基本原理就是如上描繪的那樣 我們都知道,鼠標(biāo)點(diǎn)擊click,觸屏的touch等事件,可以觸發(fā)相應(yīng)的事件處理程序,也可以為這些事件添加事件處理程序,實(shí)際開(kāi)發(fā)過(guò)程中可供我們使用的事件很少,click、doubleclick,mouseover、mousemove...
摘要:支持三個(gè)參數(shù)分別表示事件名稱(chēng),是否可以冒泡,是否阻止事件的默認(rèn)操作觸發(fā)參數(shù)表示事件對(duì)象,是方法返回的創(chuàng)建的對(duì)象監(jiān)聽(tīng)方法自定義事件常用模擬模擬方法操作或者自定義事件我的自定義事件。 事件這塊知識(shí)點(diǎn)雖然是老生長(zhǎng)談的,但對(duì)于我來(lái)說(shuō)多多整理,多多感悟,溫故知新,每次看看這塊都有不同的收獲.(在這里我不會(huì)長(zhǎng)篇大論,只會(huì)挑重點(diǎn);具體的小伙伴們自行查找) 什么是事件 在編程時(shí)系統(tǒng)內(nèi)發(fā)生的動(dòng)作或者發(fā)生...
摘要:支持三個(gè)參數(shù)分別表示事件名稱(chēng),是否可以冒泡,是否阻止事件的默認(rèn)操作觸發(fā)參數(shù)表示事件對(duì)象,是方法返回的創(chuàng)建的對(duì)象監(jiān)聽(tīng)方法自定義事件常用模擬模擬方法操作或者自定義事件我的自定義事件。 事件這塊知識(shí)點(diǎn)雖然是老生長(zhǎng)談的,但對(duì)于我來(lái)說(shuō)多多整理,多多感悟,溫故知新,每次看看這塊都有不同的收獲.(在這里我不會(huì)長(zhǎng)篇大論,只會(huì)挑重點(diǎn);具體的小伙伴們自行查找) 什么是事件 在編程時(shí)系統(tǒng)內(nèi)發(fā)生的動(dòng)作或者發(fā)生...
閱讀 1552·2023-04-26 02:08
閱讀 3140·2021-10-14 09:42
閱讀 7240·2021-09-22 15:34
閱讀 3253·2019-08-30 13:16
閱讀 2768·2019-08-26 13:49
閱讀 1357·2019-08-26 11:59
閱讀 1290·2019-08-26 10:31
閱讀 2179·2019-08-23 17:19