将自定义代码添加到mootools addEvent

时间:2010-06-28 09:56:40

标签: events mootools native extend

即使我现在已经使用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);
}
});

这个名字对吗?这是我能提出有限词汇量的最佳方法。

1 个答案:

答案 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();

当然,除非您需要定义适用于窗口或文档的内容。