2011-03-02 61 views
3

有沒有辦法暫時禁用事件偵聽器?jQuery/Javascript暫時禁用addEventListener/attachEvent附加的事件

就我而言,我有一個第三方庫 jQuery的中心),使用的addEventListener /的attachEvent元素上創建鼠標懸停/鼠標移開事件。

在某些情況下,另一個事件觸發不同的元素,我需要禁用這些事件偵聽器。到目前爲止,我的解決方案一直是簡單地使用鼠標懸停/鼠標懸停的unbind。這通常工作正常,因爲該事件通常會導致頁面刷新。

但是,每隔一段時間都會出現一個錯誤(認爲驗證錯誤),導致頁面不刷新,並且需要重新附加mouseover/mouseout事件偵聽器。

有用信息

這也許值得一提的是,因爲在創建鼠標懸停/ mouseout事件偵聽器和第三方庫中的連接,我不能簡單地將事件指派給一個變量,並綁定/以這種方式解除綁定(AFIK是做這件事的最好方法)。

更新

我原本問

是否有jQuery的辦法讓已經分配給對象的事件偵聽器?

我後來發現它是不可能通過的addEventListener /的attachEvent分配訪問事件:Access events added with attachEvent()/addEventListener() in JavaScript

回答

1

jQuery使用data存儲在內部的事件,所以你可以用它來獲取所有的事件處理程序的一個對象:

$("#foo").data("events") 

然後,您可以通過使用unbind刪除特定的處理程序:

$("#foo").unbind('click', $("#foo").data("events").click[42]); 
+0

我應該提到最初附加mouseover/mouseout事件監聽器的庫不是一個jQuery插件,而是使用本地addEventListener/attachEvent。 – xzyfer 2011-03-02 00:40:35

+0

我的歉意,我更新了這個問題來陳述它。 – xzyfer 2011-03-02 00:42:41

+0

啊,好的。我的回答可能仍會幫助來自Google的用戶,所以我會放棄它。你是否試圖禁用所有*事件監聽器,或者只是其中的一部分? – Emmett 2011-03-02 00:47:21

1

不幸的是,您無法訪問它們。充其量,您可以使用W3C的removeEventListenerdocs)和/或Microsofts detachEventdocs)刪除事件監聽器。然而,一旦聽衆被移除,它就會消失。

有一點需要特別注意removeEventListener,即如果該事件被註冊了兩次,一次指示捕捉,一旦指示未捕捉到,你必須將其刪除兩次;每個案件一次。

要了解有關捕獲和未捕獲的更多信息,請參閱W3C spec

+0

我知道這一點,謝謝。但是,使用jQuery的「unbind」可以有效地刪除使用addEventListener/attachEvent附加的事件事件。我的問題是在本地緩存事件偵聽器,以便我可以重新附加它,或者暫時禁用/重新啓用它,而無需明確刪除它。 – xzyfer 2011-03-02 01:03:59

+0

您無法緩存偵聽器並重新附加它們。他們無法訪問。 – ntownsend 2011-03-17 17:29:35

0

如果您想臨時禁用正在運行的事件處理程序,爲什麼不只是將轉義碼添加到該函數?

像這樣:

$('#button').click(function(){ 
    var clicked_element = $(this); 
    if(elem.hasClass('event-click-disabled')) 
    { 
     // logging code so we know exactly what events are being skipped 
     console.info(
      'The click event on following element was skipped', 
      clicked_element 
     ); 
     return; 
    } 
    alert('Button clicked'); 
}); 

這時如果要禁用特定元素上的事件,只需調用

element.addClass('event-click-disabled'); 

事件處理程序仍在運行,但它會立即返回。