js自定義事件及事件交互原理概述(一)
更新時(shí)間:2013年02月01日 12:22:30 作者:
在JS中事件是JS與瀏覽器交互的主要途徑,本文主要介紹下最簡(jiǎn)單的自定義事件,不過還有很多缺陷,感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)自定義事件有所幫助
在JS中事件是JS與瀏覽器交互的主要途徑。事件是一種叫做觀察者的設(shè)計(jì)模式,這是一種創(chuàng)建松散耦合代碼的技術(shù)。對(duì)象可以發(fā)布事件,用來(lái)表示在該對(duì)象生命周期中某個(gè)有趣的時(shí)刻到了。然后其他對(duì)象可以觀察該對(duì)象,等待這些有趣的時(shí)刻到來(lái)并通過運(yùn)行代碼來(lái)響應(yīng)。
觀察者模式有兩類對(duì)象組成:主題和觀察者。主體負(fù)責(zé)發(fā)布事件,同時(shí)觀察者通過訂閱這些事件來(lái)觀察該主體。該模式的一個(gè)關(guān)鍵概念是主體并不知道觀察者的任何事情,也就是說(shuō)它可以獨(dú)自存在并正常運(yùn)作即使觀察者不存在。從另一方面說(shuō),觀察者知道主體并能注冊(cè)事件的回調(diào)函數(shù)(事件處理程序)。涉及DOM上時(shí),DOM元素便是主體,你的事件處理代碼便是觀察者。
事件是與DOM交互的最常見的方式,但它們也可以用于非DOM代碼中----通過實(shí)現(xiàn)自定義事件。自定義事件背后的概念是創(chuàng)建一個(gè)管理事件的對(duì)象,讓其他對(duì)象監(jiān)聽那些事件。說(shuō)簡(jiǎn)單點(diǎn)就是我們希望在程序運(yùn)行的時(shí)候,路線可能會(huì)有很多,如果程序運(yùn)行到了一個(gè)特殊的地方,我們希望立刻運(yùn)行用戶注冊(cè)的方法里面的代碼,運(yùn)行完畢后再繼續(xù)運(yùn)行,這個(gè)過程叫做監(jiān)聽。
例如,創(chuàng)建一個(gè)文件MyEvent.js文件,里面創(chuàng)建一個(gè)類:
function MyEvent(){
this.handler;
}
MyEvent.prototype={
addHandler:function(handler)
{
this.handler=handler;
},
fire:function()
{
this.handler();
},
removeHandler:function()
{
this.handler=null;
}
}
上面使用js原型的思想創(chuàng)建的一個(gè)類,如果讀者不太了解可以查看相關(guān)資料。MyEvent類型有一個(gè)單獨(dú)的屬性handler,用于存儲(chǔ)事件處理程序(也就是用戶注冊(cè)的方法)。還有三個(gè)方法:addHandler(),用于注冊(cè)事件處理程序;fire(),用于觸發(fā)一個(gè)事件;以及removeHandler(),用于注銷事件的處理程序。
然后我們可以這樣使用,新建一個(gè)html文件,放于和MyEvent.js同一個(gè)目錄,方便引用。代碼如下:
<html>
<head>
<title></title>
<script type="text/javascript" src="MyEvent.js"></script>
<script type="text/javascript">
function init()
{
//初始化一個(gè)事件對(duì)象
var myEvent=new MyEvent();
//注冊(cè)方法
myEvent.addHandler(myMethod);
//運(yùn)行到此處時(shí)觸發(fā)事件
myEvent.fire();
//移除事件注冊(cè)的方法
myEvent.removeHandler();
//再次觸發(fā)事件,發(fā)現(xiàn)無(wú)效
myEvent.fire();
}
function myMethod()
{
alert("成功");
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="測(cè)試" />
</body>
</html>
上述的注釋已經(jīng)很詳細(xì)的說(shuō)明了其中的一種使用方式。這就是一個(gè)最簡(jiǎn)單的自定義事件,不過還有很多缺陷,如何優(yōu)化將在(二)里面進(jìn)行講解。
觀察者模式有兩類對(duì)象組成:主題和觀察者。主體負(fù)責(zé)發(fā)布事件,同時(shí)觀察者通過訂閱這些事件來(lái)觀察該主體。該模式的一個(gè)關(guān)鍵概念是主體并不知道觀察者的任何事情,也就是說(shuō)它可以獨(dú)自存在并正常運(yùn)作即使觀察者不存在。從另一方面說(shuō),觀察者知道主體并能注冊(cè)事件的回調(diào)函數(shù)(事件處理程序)。涉及DOM上時(shí),DOM元素便是主體,你的事件處理代碼便是觀察者。
事件是與DOM交互的最常見的方式,但它們也可以用于非DOM代碼中----通過實(shí)現(xiàn)自定義事件。自定義事件背后的概念是創(chuàng)建一個(gè)管理事件的對(duì)象,讓其他對(duì)象監(jiān)聽那些事件。說(shuō)簡(jiǎn)單點(diǎn)就是我們希望在程序運(yùn)行的時(shí)候,路線可能會(huì)有很多,如果程序運(yùn)行到了一個(gè)特殊的地方,我們希望立刻運(yùn)行用戶注冊(cè)的方法里面的代碼,運(yùn)行完畢后再繼續(xù)運(yùn)行,這個(gè)過程叫做監(jiān)聽。
例如,創(chuàng)建一個(gè)文件MyEvent.js文件,里面創(chuàng)建一個(gè)類:
復(fù)制代碼 代碼如下:
function MyEvent(){
this.handler;
}
MyEvent.prototype={
addHandler:function(handler)
{
this.handler=handler;
},
fire:function()
{
this.handler();
},
removeHandler:function()
{
this.handler=null;
}
}
上面使用js原型的思想創(chuàng)建的一個(gè)類,如果讀者不太了解可以查看相關(guān)資料。MyEvent類型有一個(gè)單獨(dú)的屬性handler,用于存儲(chǔ)事件處理程序(也就是用戶注冊(cè)的方法)。還有三個(gè)方法:addHandler(),用于注冊(cè)事件處理程序;fire(),用于觸發(fā)一個(gè)事件;以及removeHandler(),用于注銷事件的處理程序。
然后我們可以這樣使用,新建一個(gè)html文件,放于和MyEvent.js同一個(gè)目錄,方便引用。代碼如下:
復(fù)制代碼 代碼如下:
<html>
<head>
<title></title>
<script type="text/javascript" src="MyEvent.js"></script>
<script type="text/javascript">
function init()
{
//初始化一個(gè)事件對(duì)象
var myEvent=new MyEvent();
//注冊(cè)方法
myEvent.addHandler(myMethod);
//運(yùn)行到此處時(shí)觸發(fā)事件
myEvent.fire();
//移除事件注冊(cè)的方法
myEvent.removeHandler();
//再次觸發(fā)事件,發(fā)現(xiàn)無(wú)效
myEvent.fire();
}
function myMethod()
{
alert("成功");
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="測(cè)試" />
</body>
</html>
上述的注釋已經(jīng)很詳細(xì)的說(shuō)明了其中的一種使用方式。這就是一個(gè)最簡(jiǎn)單的自定義事件,不過還有很多缺陷,如何優(yōu)化將在(二)里面進(jìn)行講解。
相關(guān)文章
基于JavaScript實(shí)現(xiàn)年份數(shù)字拼圖效果
時(shí)光荏苒,2022年又要收尾了,公司的年會(huì)是不是都安排上了?前幾天看到一個(gè)年會(huì)抽獎(jiǎng)系統(tǒng),功能十分的強(qiáng)大,其中有一個(gè)年份數(shù)字的拼圖效果深深的吸引了哥,決定用JS實(shí)現(xiàn)一下該效果,需要的可以參考一下2022-12-12
js trim函數(shù) 去空格函數(shù)與正則集錦
在javascript中處理文本框輸入值的時(shí)候,經(jīng)常要用到"去掉前后空白"的功能。用過jQuery的朋友都知道,jQuery提供了一個(gè)trim()這樣的功能函數(shù),可以很輕松幫我們實(shí)現(xiàn)這樣的效果。2009-11-11
JavaScript實(shí)現(xiàn)商品放大鏡效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)商品放大鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
uniapp實(shí)現(xiàn)地圖點(diǎn)聚合功能的詳細(xì)教程
最近公司項(xiàng)目需求需要對(duì)設(shè)備在地圖上面進(jìn)行監(jiān)控,并在當(dāng)設(shè)備一定距離時(shí)進(jìn)行聚合,這篇文章主要給大家介紹了關(guān)于uniapp實(shí)現(xiàn)地圖點(diǎn)聚合功能的相關(guān)資料,需要的朋友可以參考下2022-12-12
Bootstrap滾動(dòng)監(jiān)聽組件scrollspy.js使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Bootstrap滾動(dòng)監(jiān)聽組件scrollspy.js的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07

