2010-06-28 32 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