更新:當你做.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