是否可以在mootools中扩展 addEvent 功能来执行某些操作并调用正常的 addEvent 方法?或者,如果某人有更好的方法来做我需要的事情,那么我就是这些年。
我有不同的“点击”处理程序,具体取决于我在网站上的哪个页面。此外,每页上可能有多个。我想让页面上的每次点击执行一段代码,除了做点击监听器会做的任何事情。在每个处理程序上添加两行,至少可以说是PITA,所以我考虑重写 addEvent ,每当我添加一个'click'监听器时,它将创建一个执行代码,然后调用函数。
知道我该怎么做吗?
答案 0 :(得分:1)
虽然这不是不可能的,但这是一个值得怀疑的做法 - 改变mootools内部apis。除非你精通mootools并遵循github上的开发方向,并且知道你的改变不会破坏未来的兼容性,否则我会建议反对它。
我看到它的方式,你有两条路线:
通过implement
创建一个符合逻辑的新Element方法。例如:Element.addMyEvent
做你的事,然后调用正常的element.addEvent
。这是优选的,没有实际的不利影响(见上文)
直接更改原型。意味着你无法重构任何代码,它只会起作用。这可能意味着其他人开始使用你的代码会遇到困难以及跟踪/故障排除困难 - 想想,知道mootools和标准addEvent
行为的人甚至不会考虑检查原型是否有效遇到问题。
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
。