儘管我現在一直在使用mootools,但我還沒有真正與當地玩家一起玩。目前我試圖通過在原始旁添加一個自定義的addEvent方法來擴展事件。我這樣做,用下面的代碼(從核心的mootools複製)將自定義代碼添加到mootools addEvent
Native.implement([Element, Window, Document], {
addMyEvent:function(){/* code here */}
}
現在的問題是,我似乎無法弄清楚,如何正確地覆蓋現有fireEvent
法的方式,但我還是能打電話執行我自己的邏輯之後的原始方法。
我大概可以得到一些醜陋的黑客所期望的結果,但我更喜歡學習優雅的方式:)
更新:嘗試了醜陋的黑客。他們都沒有工作。要麼我不明白關閉,要麼我在調整錯誤的地方。我試着將Element.fireEvent
保存到一個臨時變量(有和沒有使用閉包),然後我將從覆蓋的fireEvent函數中調用(使用Native.implement
覆蓋 - 與上面相同)。結果是一個無止境的循環,fireEvent
一遍又一遍地調用自己。
更新2: 我跟着執行使用螢火蟲,它導致我Native.genericize
,這似乎是作爲一種本地類的方法代理。因此,我沒有引用實際的fireEvent方法,而是引用了代理並導致了無限循環。谷歌沒有找到任何有關這方面的有用文件,當我不完全瞭解它是如何工作的時候,我有點擔心如何在引擎蓋下進行探測,因此非常感謝任何幫助。
更新3 - 原來的問題解決了: 正如我回答下面貝爾巴托夫的評論,我是自己來解決原來的問題。我試圖創建一個方法來添加事件,在一定程度的執行後自毀。雖然原來的問題已經解決,但我關於擴展本地化的問題依然存在。
這裏的成品代碼:
Native.implement([Element, Window, Document], {
addVolatileEvent:function(type,fn,counter,internal){
if(!counter)
counter=1;
var volatileFn=function(){
fn.run(arguments);
counter-=1;
if(counter<1)
{
this.removeEvent(type,volatileFn);
}
}
this.addEvent(type,volatileFn,internal);
}
});
的名稱是正確的?這是我能拿出有限的詞彙的最好方式。
'如何正確覆蓋現有的fireEvent方法,我仍然可以在執行自己的邏輯之後調用orignal方法 - 將原來的fireEvent回調作爲第二個回調添加到邏輯中會更有意義?又名。 'element.addEvent(「click」,function(e){someFunction(this,e); ... normal code});'或者,除了本地事件之外,簡單地添加一個自定義事件,然後執行'this.fireEvent (「點擊」,e)'爲原始也發射。 - 當您沒有共享更多代碼來顯示問題的上下文時,有點難以分辨。 – 2010-06-28 13:15:56
嘿,我解決了這個問題。似乎我再一次沉迷於尋找新的有趣問題的解決方案,忘記嘗試另一種解決方案。我正在研究一種名爲'addVolatileEvent'的方法,其工作方式與'addEvent'類似,但每個'fireEvent'都有一個計數器,並在達到零後破壞事件,從而輕鬆添加一次性事件。最有可能的方法名稱我想出了沒有任何意義,所以隨時建議更好的一個:) – jpeltoniemi 2010-06-28 14:00:20