欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js自定義事件及事件交互原理概述(二)

 更新時間:2013年02月01日 14:12:53   作者:  
上一篇的目的只是讓大家簡單的理解自定事件是如何模擬出來的,大家不難發(fā)現(xiàn)會有很多缺陷,本篇主要已解決上一篇的問題為主,感興趣的朋友可以參考,或許本文對你有所幫助
js自定義事件(一)的目的只是讓大家簡單的理解自定事件是如何模擬出來的,大家不難發(fā)現(xiàn)會有很多缺陷,比如:
1、此事件對象只能注冊一個事件,不能提供多個事件
2、注冊方法沒有返回的一些信息

下面我們就來解決這些問題。如下為MyEvent.js源代碼:
復制代碼 代碼如下:

function MyEvent(){
this.handlers={};
}
MyEvent.prototype={
addHandler:function(type,handler)
{
if(typeof this.handlers[type]=="undefined")
{
this.handlers[type]=[];
}
this.handlers[type].push(handler);
},
fire:function(event)
{if(this.handlers[event.type] instanceof Array)
{
var handlers=this.handlers[event.type];
for(var i= 0, len=handlers.length;i<len;i++)
{
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);
}
}
};

此類就是對第一篇的優(yōu)化。
屬性handler變成了handlers,變成了一個數(shù)組
addHandler()方法接受兩個參數(shù):事件類型和用于處理該事件的函數(shù)。當調(diào)用該方法時,會進行一次檢查,看看handlers屬性中是否已經(jīng)存在一個針對該事件類型的數(shù)組
;如果沒有,則創(chuàng)建一個新的。然后使用push()將該處理程序添加到數(shù)組的末尾。

fire()方法用于觸發(fā)一個事件,該方法接受一個參數(shù),是一個至少包含type屬性的對象,不然無法確定handlers里面是否已經(jīng)存在。它會通過此type去查找對應該事件類型的一組處理程序,調(diào)用各個函數(shù),并給出event對象。因為這些都是自定義對象,所以event對象上面的其他東西可以由你自己定義。

removeHandler()方法時addHandler()的輔助,它們接受的參數(shù)一樣:事件的類型和事件處理程序。這個方法搜索事件處理程序的數(shù)組找到要刪除的處理程序的位置。如果找到了,則使用break操作符退出循環(huán)。然后使用splice()方法將該項目從數(shù)組中刪除。

這里使用方式我們換一種比較長用的形式,現(xiàn)在據(jù)我說知很多產(chǎn)品在使用事件上有兩種方式,一種是直接繼承(js本省沒有此概念,不過我們可以通過原型鏈模擬出繼承的效果,此處不做詳細解釋)此事件對象,那么就會擁有了這些行為,不過此方法比較局限,另一種方式更常用一些,就是需要使用事件的類上面創(chuàng)建一個屬性用于存放此對象。如:子相同目錄下再創(chuàng)建一個Student.js文件,里面的代碼如下:
復制代碼 代碼如下:

function Student(name)
{
this.myEvent=new MyEvent();
this.name=name;
}
Student.prototype={
setName:function(name)
{
var eventStart={
type:"changeNameStart",
newName:name,
oldName:this.name
};
this.myEvent.fire(eventStart);
this.name=name;
}
}

這里有一個學生類,構造函數(shù)里面初始化一個MyEvent對象作為屬性,通過參數(shù)初始化name屬性。

提供一個方法setName用于改變名字,不過在改變名字之前設置了可能觸發(fā)事件changNameStart的監(jiān)聽。
創(chuàng)建一個html頁面,放于同個目錄下,代碼如下:
復制代碼 代碼如下:

<html>
<head>
<title></title>
<script type="text/javascript" src="MyEvent.js"></script>
<script type="text/javascript" src="Student.js"></script>
<script type="text/javascript">
function init()
{
 //初始化一個學生對象
var student=new Student("Mr liu");
 //注冊事件changNameStart
student.myEvent.addHandler("changeNameStart",myMethod);
//設置name,將會觸發(fā)事件changNameStart
student.setName("Mr Huang");
}
function myMethod(e)
{
alert("事件類型:"+e.type+"; 改變前的名字:"+ e.oldName+"; 改變后的名字:"+ e.newName);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="測試" />
</body>
</html>

這樣使用起來就會很方便,也是一種常用的使用方式。
一般在真正的項目里面使用使用事件時我們還需要做一些優(yōu)化,比如:
1、用戶并不知道我們提供了哪些事件,從代碼來看好像什么事件都可以添加到handlers里面,但是真正起效果的(我們設置fire()方法的地方)事件我們并不能從代碼里面很直觀的看出來,一般做產(chǎn)品,在這方面都需要再做考慮。

2、有沒有發(fā)現(xiàn)fire的參數(shù)event好像沒用固定,在大興項目里面,最好event也做成一個類型,在fire的地方就比較方便使用一些,event可能會有很多種類型,那時可能fire里面會出現(xiàn)一些判定了。
希望對初入js事件的讀者有所幫助,互相交流。

相關文章

  • 使用?JavaScript?Promise?讀取?Github?用戶數(shù)據(jù)

    使用?JavaScript?Promise?讀取?Github?用戶數(shù)據(jù)

    這篇文章主要介紹了使用JavaScript?Promise讀取Github用戶數(shù)據(jù),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 微信小程序實現(xiàn)時間預約功能

    微信小程序實現(xiàn)時間預約功能

    這篇文章主要為大家詳細介紹了微信小程序實現(xiàn)時間預約基本功能,一個類似電商的時間預約功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 基于JavaScript實現(xiàn)前端文件的斷點續(xù)傳

    基于JavaScript實現(xiàn)前端文件的斷點續(xù)傳

    這篇文章主要介紹了基于JavaScript實現(xiàn)前端文件的斷點續(xù)傳的相關資料,需要的朋友可以參考下
    2016-10-10
  • js模擬實現(xiàn)煙花特效

    js模擬實現(xiàn)煙花特效

    這篇文章主要為大家詳細介紹了js模擬實現(xiàn)煙花特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • uniapp小程序項目獲取位置經(jīng)緯度信息

    uniapp小程序項目獲取位置經(jīng)緯度信息

    在實際項目中很多時候我們需要獲取設備的位置信息,去展示給客戶,或者以位置信息為參數(shù),繼續(xù)向服務器獲取一些數(shù)據(jù),這篇文章主要介紹了uni-app如何獲取位置信息(經(jīng)緯度),需要的朋友可以參考下
    2022-11-11
  • JS實現(xiàn)的DIV塊來回滾動效果示例

    JS實現(xiàn)的DIV塊來回滾動效果示例

    這篇文章主要介紹了JS實現(xiàn)的DIV塊來回滾動效果,結合實例形式分析了JS通過時間函數(shù)定時觸發(fā)動態(tài)改變頁面元素樣式的相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • 微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法

    微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法

    這篇文章主要介紹了微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • javascript 漢字轉拼音實現(xiàn)代碼

    javascript 漢字轉拼音實現(xiàn)代碼

    主要是提前定義了很多文字,這樣的方法不是很是,如果庫中沒有這個詞,是看不到相關信息的。
    2009-12-12
  • JavaScript callback回調(diào)函數(shù)用法實例分析

    JavaScript callback回調(diào)函數(shù)用法實例分析

    這篇文章主要介紹了JavaScript callback回調(diào)函數(shù)用法,結合實例形式分析了callback回調(diào)函數(shù)的概念、功能、應用場景及相關使用技巧,需要的朋友可以參考下
    2018-05-05
  • TypeScript中d.ts類型聲明文件的實現(xiàn)

    TypeScript中d.ts類型聲明文件的實現(xiàn)

    .d.ts 文件是 TypeScript 的類型聲明文件,它們的主要作用是為 JavaScript 庫提供類型支持,本文主要介紹了TypeScript中d.ts類型聲明文件的實現(xiàn),感興趣的可以了解一下
    2023-10-10

最新評論