Events 向mootools addEvent添加自定义代码
尽管我已经使用mootools一段时间了,但我还没有真正开始和当地人玩。目前,我正试图通过在原始方法的旁边添加一个自定义addEvent方法来扩展事件。我使用以下代码(复制自mootools core) 现在的问题是,我似乎不知道如何正确地覆盖现有的Events 向mootools addEvent添加自定义代码,events,mootools,native,extend,Events,Mootools,Native,Extend,尽管我已经使用mootools一段时间了,但我还没有真正开始和当地人玩。目前,我正试图通过在原始方法的旁边添加一个自定义addEvent方法来扩展事件。我使用以下代码(复制自mootools core) 现在的问题是,我似乎不知道如何正确地覆盖现有的firevent方法,在执行自己的逻辑后,我仍然可以调用原始方法 我可能会用一些丑陋的技巧得到想要的结果,但我更喜欢用优雅的方式学习:) 更新:尝试了几个丑陋的黑客。他们都没有工作。要么我不理解闭包,要么我调整了错误的位置。我尝试将元素.fireE
firevent
方法,在执行自己的逻辑后,我仍然可以调用原始方法
我可能会用一些丑陋的技巧得到想要的结果,但我更喜欢用优雅的方式学习:)
更新:尝试了几个丑陋的黑客。他们都没有工作。要么我不理解闭包,要么我调整了错误的位置。我尝试将
元素.fireEvent
保存到一个临时变量中(使用闭包和不使用闭包),然后从覆盖的fireEvent函数调用该变量(使用本机.implement进行覆盖-同上)。结果是,firevent
一次又一次地调用自己,形成了一个无休止的循环
更新2:
我使用firebug跟踪执行过程,它引导我找到了Native.genericze
,它似乎充当了本机类方法的代理。因此,我没有引用实际的fireEvent方法,而是引用了代理,这导致了无限循环。谷歌没有找到任何关于这方面的有用文档,当我不完全理解它的工作原理时,我有点担心在引擎盖下翻来覆去,因此非常感谢您的帮助
更新3-原始问题已解决:
当我在下面回复Dimitar的评论时,我自己设法解决了最初的问题。我试图创建一种方法来添加事件,这些事件在执行一定数量的执行后会自我毁灭。虽然最初的问题已经解决了,但我关于扩展本地人的问题仍然存在
以下是完成的代码:
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);
}
});
Native.implement([元素、窗口、文档]{
addVolatileEvent:函数(类型、fn、计数器、内部){
如果(!计数器)
计数器=1;
var volatileFn=函数(){
fn.run(参数);
计数器-=1;
if(计数器
添加一个简单的事件处理程序,该处理程序计算它所经历的迭代次数,然后进行自我销毁
将事件视为特定键下的简单回调,其中一些绑定到触发的特定事件
如果可能,使用元素存储总是可取的——它允许您在不同的作用域之间共享同一元素上的数据,而不需要复杂的穿孔或全局变量
当地人不应该这样做,只要做:
Element.implement({
newMethod: function() {
// this being the element
return this;
}
});
document.id("clicker").newMethod();
当然,除非您需要定义同样适用于窗口或文档的内容
添加一个简单的事件处理程序,该处理程序计算它所经历的迭代次数,然后进行自我销毁
将事件视为特定键下的简单回调,其中一些绑定到触发的特定事件
如果可能,使用元素存储总是可取的——它允许您在不同的作用域之间共享同一元素上的数据,而不需要复杂的穿孔或全局变量
当地人不应该这样做,只要做:
Element.implement({
newMethod: function() {
// this being the element
return this;
}
});
document.id("clicker").newMethod();
当然,除非您需要定义同样适用于窗口或文档的内容。如何正确覆盖现有的fireEvent方法,使我在执行自己的逻辑后仍然可以调用原始方法
-将您的逻辑作为第二个调用添加到原始fireEvent回调中是否更有意义相反,ck?aka.element.addEvent(“单击”,函数(e){someFunction(this,e);…normal code});
或者,在本机事件之外添加一个自定义事件,然后执行this.firevent(“单击”,e)
原版也会触发。-当您没有共享更多代码来显示问题的上下文时,有点难说。呵呵,我解决了问题。似乎我又一次痴迷于为新的有趣问题找到解决方案,而忘了为原版尝试另一种方法。我正在处理一个方法调用edaddVolatileEvent
,它的工作原理与addEvent
类似,但它有一个计数器,在每个fireEvent
上递减,并且在达到零后,它会破坏事件,使添加一次性事件变得很容易。我提出的方法名称很可能毫无意义,所以请随意推荐一个更好的方法:)如何正确覆盖现有的fireEvent方法,使我在执行自己的逻辑后仍然可以调用原始方法
-将您的逻辑添加到原始fireEvent回调中作为第二个回调是否更有意义?aka.element.addEvent(“单击”,函数(e){someFunction(this,e);…normal code});
或者,只需在本机事件之外添加一个自定义事件,然后执行this.firevent(“单击”,e)
原版也会触发。-当您没有共享更多代码来显示问题的上下文时,有点难说。呵呵,我解决了问题。似乎我又一次痴迷于为新的有趣问题找到解决方案,而忘了为原版尝试另一种方法。我正在处理一个方法调用edaddVolatileEvent
,它的工作原理与addEvent
类似,但它有一个计数器,在每个fireEvent
上递减,并且在达到零后,它会破坏事件,使添加一次性事件变得很容易。我提出的方法名称很可能毫无意义,所以请随意推荐一个更好的方法:)谢谢。您可能想查看我之前添加到问题中的脚本。这里也有:我的方法允许我使用addVolatileEvent
几乎任何支持常规addEvent
的地方,并且它不使用元素存储。根据这个定义,许多mootools可以
Element.implement({
newMethod: function() {
// this being the element
return this;
}
});
document.id("clicker").newMethod();