即使我现在已经使用mootools一段时间了,但我还没有真正和当地人一起玩。目前我正在尝试通过在原始文件旁添加自定义addEvent方法来扩展事件。我使用以下代码(从mootools核心复制)
Native.implement([Element, Window, Document], {
addMyEvent:function(){/* code here */}
}
现在的问题是,我似乎无法弄明白,如何正确地覆盖现有的fireEvent
方法,我仍然可以在执行自己的逻辑后调用orignal方法。
我可能会用一些丑陋的黑客获得理想的结果,但我更喜欢学习优雅的方式:)
更新:尝试了几个丑陋的黑客。他们都没有工作。要么我不理解闭包,要么我在调整错误的地方。我尝试将Element.fireEvent
保存到临时变量(使用和不使用闭包),然后我将从覆盖的fireEvent函数调用(使用Native.implement
覆盖 - 与上面相同)。结果是一个无限循环,fireEvent
一遍又一遍地调用自己。
更新2:
我使用firebug跟踪执行,它引导我Native.genericize
,这似乎是本机类方法的一种代理。因此,我没有引用实际的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);
}
});
这个名字对吗?这是我能提出有限词汇量的最佳方法。
答案 0 :(得分: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();
当然,除非您需要定义适用于窗口或文档的内容。