JavaScript事件設(shè)計(jì)模式
本文章參考自:《征服Ajax Web 2.0 開(kāi)發(fā)技術(shù)詳解》為了自己日后查閱并與大家共享,。
1. 事件設(shè)計(jì)概述 事件機(jī)制可以是程序邏輯更加清晰可見(jiàn),在JavaScript中很多對(duì)象都有自己的事件,,如:button有onclick事件,,selcet有 onchange事件,。對(duì)于我們自己設(shè)計(jì)的類,,是否也可以有事件機(jī)制呢,?答案是肯定的,。我們可以通過(guò)事件機(jī)制,將類設(shè)計(jì)為獨(dú)立的模塊,,從而使其可以通過(guò)事 件與外通信,,提高程序的開(kāi)發(fā)效率。 2. 不帶參數(shù)的事件設(shè)計(jì)模式 最簡(jiǎn)單的一種模式是將一個(gè)類的方法成員定義為事件,,可以借助JavaScript的基本語(yǔ)法來(lái)實(shí)現(xiàn),,通常是一個(gè)空的方法。例如:
obj.onShow 方法在類的外部被定義,,在類的內(nèi)部方法 show() 中被調(diào)用,,這就實(shí)現(xiàn)了事件機(jī)制。 此設(shè)計(jì)模式應(yīng)用起來(lái)簡(jiǎn)單,,但有其有以下缺點(diǎn):
3. 給事件處理程序傳遞參數(shù) 給事件處理程序傳遞參數(shù)不僅是自定義事件中存在的問(wèn)題,也是系統(tǒng)內(nèi)部對(duì)象的事件機(jī)制中存在的問(wèn)題,,因?yàn)槭录C(jī)制僅傳遞一個(gè)函數(shù)名稱,,不帶有任何參數(shù)信息,所以無(wú)法傳遞參數(shù)進(jìn)去,。例如:
上面的程序是無(wú)法傳遞參數(shù)進(jìn)去的,,為了解決這個(gè)問(wèn)題,我們可以從相反的思維方式去考慮問(wèn)題,。不考慮怎么把參數(shù)傳遞進(jìn)去,,而是考慮如何構(gòu)建一個(gè)無(wú)需參數(shù)的事件處理程序。我們看看先看看下面的函數(shù):
該方法將一個(gè)有參數(shù)的函數(shù)封裝為一個(gè)無(wú)參數(shù)的函數(shù),不僅對(duì)全局函數(shù)適用,,作為 對(duì)象方法存在的函數(shù)也是適用的,。該方法首先接收兩個(gè)參數(shù):obj 和 strFunc ,obj 表示事件處理程序所在的對(duì)象,; strFunc 表示事件處理程序的名稱,。程序中還利用了arguments對(duì)象(arguments是傳遞給函數(shù)的隱含參數(shù),arguments對(duì)象存儲(chǔ)的是實(shí)際傳遞給 函數(shù)的參數(shù),,而且不局限與函數(shù)聲明所定義的形參列表,。關(guān)于arguments對(duì)象可以參考其他資料)處理第二個(gè)參數(shù)以后的隱式參數(shù),即未定義為形參的參 數(shù),, 例如:事件處理程序 someObject.eventHandler = function(_arg1, _arg2){ //事件處理代碼 } 應(yīng)該調(diào)用:creatFunction(someObject, "eventHander", arg1, arg2); 這樣就返回一個(gè)無(wú)參數(shù)的函數(shù),,在返回的函數(shù)中已經(jīng)包括了傳遞進(jìn)去的參數(shù)。如果是全局函數(shù)作為事件處理程序,,事實(shí)上它是window 對(duì)象的一個(gè)方法,,所以可以傳遞window對(duì)象作為obj參數(shù),為了更清晰一點(diǎn),,也可以指定obj為null,, creatFunction函數(shù)內(nèi)部會(huì)自動(dòng)認(rèn)為該函數(shù)是全局函數(shù),從而自動(dòng)吧obj賦值為window,。最后完成的代碼如下:
|
|
來(lái)自: Wiley Library > 《JavaScript》