更新:当你做.addEvent('type', function(){ })
和.removeEvent('type', function(){ })
,即使功能可能具有相同的“签名”,它们是两个separte匿名函数,分配上苍蝇。函数1是!==到函数2 - 因此当MooTools尝试删除它时没有匹配。
能够去除一个确切的处理程序,O:
功能处理器(){...} el.addEvent( '点击',处理程序); // ..稍后 el.removeEvent('click',handler);
在内部,事件实际上是元素存储中函数的键映射。看看这个小提琴,我做了一段时间回到另一个SO问题 - http://www.jsfiddle.net/mVJDr/
它将检查在给定的元素(或所有事件)上查看特定事件类型的事件数量。
同样,removeEvent
寻找事件存储中的匹配 - 看看http://jsfiddle.net/dimitar/wLuY3/1/。因此,使用Nikolaus建议的命名功能可以让您轻松移除它们,因为它提供了匹配。
此外,您可以通过element.removeEvents("click")
删除所有click
事件的事件。
您的页面现在会发出警报,因为您将alert作为函数传递,并使用参数'foobar'执行它。 METHOD
后面跟着()
javascript的意思是立即运行METHOD
即时排除它,而不是之后。当您将函数绑定到事件时,仅传递引用(方法名称)。
避免使用匿名函数传递参数,就是你可以这样做:
document.id('foobar').addEvent('click', alert.bind(this, 'foo'));
为绑定斥责为你,但除去这将是更加复杂。
为事件委托,它是:
parentEl.addEvents({
"click:relay(a.linkout)": function(e, el) {
},
"mouseover:relay(li.menu)": function(e, el) {
}
});
更多的是,这里http://mootools.net/docs/more/Element/Element.Delegation#Element:removeEvent
记住它不是很大/非常稳定。对于点击的东西工作正常,mouseenter不会被使用委托,只是鼠标悬停 - 这意味着IE浏览器可以在不应该时触发鼠标。我理解的方式,它的未来在mootools的提高2.0
编辑更新在mootools的显示的一类图形中结合的和未结合的方法的一个例子
http://www.jsfiddle.net/wmhgw/
var foo = new Class({
message: "hi",
toElement: function() {
return this.element = new Element("a", {
href: "http://www.google.com",
text: "google",
events: {
"click": this.bar.bind(this), // bind it
"mouseenter": this.bar // unbound -> this.element becomes this
}
});
},
bar: function(event) {
event.stop();
// hi when bound to class instance (this.message will exist)
// 'undefined' otherwise.
console.log(this.message || "undefined");
}
});
document.id(new foo()).inject(document.body);
所述的mouseenter这里将被解除绑定,其中this
将引用默认范围(即触发事件的元素 - a href)。当绑定时,您可以通过event.target
获取元素 - 事件对象始终作为参数传递给函数。
顺便说一句,这是一个稍微不太熟悉的类和元素关系的使用,但它符合我的目的来说明类的上下文中的绑定。
这里是一个jsfiddle: http://jsfiddle.net/wLuY3/ – 2010-08-24 13:12:21