【问题标题】:How to extend a native mootools method如何扩展原生 mootools 方法
【发布时间】:2011-07-18 16:58:58
【问题描述】:

是否可以在 mootools 中扩展 addEvent 函数来做某事,并调用普通的 addEvent 方法?或者,如果有人有更好的方法来做我需要的事情,我会一直坚持下去。

根据我在网站上的哪个页面,我有不同的“点击”处理程序。此外,每一页上可能有不止一个。我想让页面上的每次点击都执行一段代码,除了做点击监听器会做的任何事情。在每个处理程序上添加两行,至少可以说是一个 PITA,所以我考虑重写 addEvent ,每次我添加一个“点击”监听器时,它都会创建一个新函数执行代码,然后调用函数。

知道我该怎么做吗?

【问题讨论】:

    标签: mootools mootools-events


    【解决方案1】:

    虽然这并非不可能,但这是一种值得怀疑的做法——更改 mootools 内部 API。除非您精通 mootools 并遵循 github 上的开发方向,并且知道您的更改不会破坏未来的兼容性,否则我建议您不要这样做。

    在我看来,你有两条路线:

    1. 通过 implement 创建一个新的 Element 方法来执行您的逻辑。例如:Element.addMyEvent 做你的事,然后调用正常的element.addEvent。这是可取的,并且没有真正的不利影响(见上文)

    2. 直接更改原型。意味着您无需重构任何代码,它就可以正常工作。这可能意味着使用您的代码的其他人将难以遵循它以及难以跟踪/故障排除 - 想想,了解 mootools 和标准 addEvent 行为的人甚至不会考虑在遇到问题时检查原型.

    3. 如果 mootools 放弃 Element.prototype 修改以支持包装器(为了与其他框架兼容),那么即将推出的 mootools 2.0 可能会使上述方法 2 无效。回到方法1 :)

    我认为解决方案 1 更好更明显。

    至于2:http://jsfiddle.net/dimitar/aTukP/

    (function() {
        // setup a proxy via the Element prototype.
        var oldProto = Element.prototype.addEvent;
    
        // you really need [Element, Document, Window] but this is fine.
        Element.prototype.addEvent = function(type, fn, internal){
            console.log("added " + type, this); // add new logic here. 'this' == element.
            oldProto.apply(this, arguments);
        };
    
    })();
    
    document.id("foo").addEvent("click", function(e) {
        e.stop();
        console.log("clicked");
        console.log(e);
    });
    

    就这么简单。请记住Element.events 也应该转到文档和窗口。此外,这不会更改 Events 类 mixin,因为您需要重构 Events.addEvent

    【讨论】:

    • 感谢 Dimitar 的精彩回答。我同意方法 1 是两者中更好的方法,我将尝试将其应用于此案例。关于方法2,我有一个调用domready(第一个)的函数,它在元素上实现了一些东西,调用那个代码就足够了吗?
    • 没有。在 domready 之前添加该代码。这会影响原型,只需要在开始事件之前定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2012-09-23
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多