尽管我现在一直在使用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