如何扩展本机mootools方法

时间:2011-07-18 16:58:58

标签: javascript-events mootools

是否可以在mootools中扩展 addEvent 功能来执行某些操作并调用正常的 addEvent 方法?或者,如果某人有更好的方法来做我需要的事情,那么我就是这些年。

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

知道我该怎么做吗?

1 个答案:

答案 0 :(得分:1)

虽然这不是不可能的,但这是一个值得怀疑的做法 - 改变mootools内部apis。除非你精通mootools并遵循github上的开发方向,并且知道你的改变不会破坏未来的兼容性,否则我会建议反对它。

我看到它的方式,你有两条路线:

  1. 通过implement创建一个符合逻辑的新Element方法。例如:Element.addMyEvent做你的事,然后调用正常的element.addEvent。这是优选的,没有实际的不利影响(见上文)

  2. 直接更改原型。意味着你无法重构任何代码,它只会起作用。这可能意味着其他人开始使用你的代码会遇到困难以及跟踪/故障排除困难 - 想想,知道mootools和标准addEvent行为的人甚至不会考虑检查原型是否有效遇到问题。

  3. 如果mootools远离Element.prototype修改而转而使用包装器(为了与其他框架兼容),
  4. mootools 2.0可能会失败上面的方法2。返回方法 1 :)

  5. 我认为解决方案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