2010-06-28 37 views
1

儘管我現在一直在使用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); 
} 
}); 

的名稱是正確的?這是我能拿出有限的詞彙的最好方式。

+0

'如何正確覆蓋現有的fireEvent方法,我仍然可以在執行自己的邏輯之後調用orignal方法 - 將原來的fireEvent回調作爲第二個回調添加到邏輯中會更有意義?又名。 'element.addEvent(「click」,function(e){someFunction(this,e); ... normal code});'或者,除了本地事件之外,簡單地添加一個自定義事件,然後執行'this.fireEvent (「點擊」,e)'爲原始也發射。 - 當您沒有共享更多代碼來顯示問題的上下文時,有點難以分辨。 – 2010-06-28 13:15:56

+0

嘿,我解決了這個問題。似乎我再一次沉迷於尋找新的有趣問題的解決方案,忘記嘗試另一種解決方案。我正在研究一種名爲'addVolatileEvent'的方法,其工作方式與'addEvent'類似,但每個'fireEvent'都有一個計數器,並在達到零後破壞事件,從而輕鬆添加一次性事件。最有可能的方法名稱我想出了沒有任何意義,所以隨時建議更好的一個:) – jpeltoniemi 2010-06-28 14:00:20

回答

1
document.id("clicker").addEvents({ 
    "boobies": function() { 
     console.info("nipple police"); 
     this.store("boobies", (this.retrieve("boobies")) ? this.retrieve("boobies") + 1 : 1); 
     if (this.retrieve("boobies") == 5) 
      this.removeEvents("boobies"); 
    }, 
    "click": function() { 
     // original function can callback boobies "even" 
     this.fireEvent("boobies"); 
     // do usual stuff. 
    } 
}); 

添加一個簡單的事件處理程序來計算它經歷的迭代次數,然後自毀。

將事件視爲特定鍵下的簡單回調,其中一些鍵綁定到特定事件,並被激活。

如果可能的話,使用元素存儲總是可取的 - 它允許您在不同範圍之間共享同一元素上的數據,而不使用複雜的打孔或全局變量。

本地人不應該像這樣被改裝成的,只是做:

Element.implement({ 
    newMethod: function() { 
     // this being the element 
     return this; 
    } 
}); 

document.id("clicker").newMethod(); 

除非,當然,你需要定義的東西,適用於窗口或文檔爲好。

+0

謝謝。您可能想查看我之前添加到問題中的腳本。它也可以在這裏找到:http://jsfiddle.net/ZVbWP 我的方法讓我使用'addVolatileEvent'實際上支持常規'addEvent'的任何地方,它不使用元素存儲。 – jpeltoniemi 2010-06-28 19:23:11

+0

這是過度工程:檢查http://jsfiddle.net/ZVbWP/1/ – 2010-06-28 20:17:38

+0

通過該定義,許多mootools便利功能也必須被稱爲過度工程,你不覺得嗎?我在這裏完成的純粹是一種便於我自己使用的方法,可以避免隨時編寫計數器(這會減少錯誤的可能嵌套依據)。另請注意,我的方法不依賴於元素存儲,它也可用於Events類,而不僅僅是元素事件。 我會很樂意採取所有的crique(建設性的請:)你可以想出,但我真的不明白這是如何過度工程。 – jpeltoniemi 2010-06-29 07:37:14