1

尽管我已经使用 mootools 有一段时间了,但我还没有真正开始和当地人一起玩。目前,我正在尝试通过在原始事件旁边添加自定义 addEvent 方法来扩展事件。我使用以下代码做到了这一点(从 mootools 核心复制)

Native.implement([Element, Window, Document], {
    addMyEvent:function(){/* code here */}
}

现在的问题是我似乎无法弄清楚如何正确覆盖现有fireEvent方法,以便在执行自己的逻辑后仍然可以调用原始方法。

我可能会通过一些丑陋的技巧得到想要的结果,但我更喜欢学习优雅的方式:)


更新:尝试了几个丑陋的黑客。他们都没有工作。要么我不理解闭包,要么我调整了错误的地方。我尝试保存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);
}
});

名字对吗?这是我能想到的最好的我有限的词汇量。

4

1 回答 1

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.
    }
});

添加一个简单的事件处理程序,计算它经历的迭代次数,然后自毁。

将事件视为特定键下的简单回调,其中一些绑定到被触发的特定事件。

如果可能,始终建议使用元素存储 - 它允许您在不同范围之间共享同一元素上的数据,而无需复杂的穿孔或全局变量。

不应该像这样修改 Natives,只需执行以下操作:

Element.implement({
    newMethod: function() {
        // this being the element
        return this;
    }
});

document.id("clicker").newMethod();

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

于 2010-06-28T15:59:53.187 回答