2010-06-24 45 views
2

我有一個click事件的幾個要素:的Javascript改寫事件

$$('.set_main').invoke('observe', 'click', set_main); 

,我想改變的事件觀察。我的問題是,我必須的東西,如先移除事件監聽器:

$$('.thumb').each(function(item) 
{ 
    Event.stopObserving(item, 'click', set_main); 
}); 

或可我只是用$$('.set_main').invoke('observe', 'click', view);覆蓋它嗎?

無論如何這工作,但我想知道這是否影響性能。也許我沒有任何使用,將事件監聽器保存在內存中。

回答

2

取消註冊一個或多個事件處理程序。

如果省略了處理程序,則爲該eventName的元素註銷所有事件處理程序。如果eventName也被忽略,則註銷元素上的所有事件處理程序。 (在每種情況下,只能通過影響原型註冊的處理程序。) 例子

假設:

$('foo').observe('click', myHandler); 

...我們能停止使用該處理程序,像這樣觀察:

$('foo').stopObserving('click', myHandler); 

如果我們想要從'foo'中刪除所有'click'處理程序,我們離開處理程序參數:

$('foo').stopObserving('click'); 

如果我們要刪除所有處理程序從「富」(或許我們即將從DOM中刪除)的所有事件中,我們簡單地忽略這兩個處理程序和事件名稱:

$('foo').stopObserving(); 

一個常見的錯誤

當使用實例方法作爲觀察員,這是常見的對他們的使用功能#綁定,例如:

$('foo').observe('click', this.handlerMethod.bind(this)); 

如果你這樣做,這是不行的註銷處理程序:

$('foo').stopObserving('click', this.handlerMethod.bind(this)); // <== WRONG 

函數#綁定每次調用時都會返回一個新函數,所以如果不保留觀察時使用的引用,則不能特別解除該函數的解除綁定。 (您仍然可以解開元素上一個事件的所有處理,或所有的處理程序完全。)

要做到這一點,你需要一個參考保留給綁定功能:

this.boundHandlerMethod = this.handlerMethod.bind(this); 
$('foo').observe('click', this.boundHandlerMethod); 

...和然後刪除:

$('foo').stopObserving('click', this.boundHandlerMethod); // <== Right