2014-05-25 62 views
2

我正在嘗試爲允許用戶注入JavaScript的平臺創建腳本。他們正在使用YUI,特別是將事件附加到按鈕上。我想攔截這個按鈕,但我不知道如何停止,阻止,移除或以其他方式阻止事件處理程序發起。如何刪除YUI委託事件?

注:我沒有()由`Y.delegate返回的處理程序直接訪問

到目前爲止,我已經試過

Y.detachAll('click'); 
Y.unsubscribeAll('click'); 
Y.one('body').detachAll('click'); 
Y.one('body').unsubscribeAll('click'); 
Y.one('.the-delegated-class').detachAll('click'); 
Y.one('.the-delegated-class').unsubscribeAll('click'); 

一切都無濟於事。實際上,我唯一的成功就是完全刪除並替換主體HTML,它明顯地將所有事件處理程序與它相結合,而不僅僅是我想要刪除的那個。

任何見解?

+0

該平臺不是任何偶然的方格,是嗎? :P – cregox

+1

@Cawas是的,不知道爲什麼我這麼模糊......: -/ – KTastrophy

+0

相當的話,我使用'destroy(true)':http://stackoverflow.com/a/9405055/ 274502 – cregox

回答

1

原來我嘗試之一是正確的方法,但我的用法是錯誤的。我(在不知不覺中)試圖在事件首先被附加之前將事件分開。

,在的情況下,說: Y.one('body).delegate('click',...)

這工作: Y.one('body').detach('click')

雖然理想情況下你會打電話直接分離由委託調用返回的EventHandle。

0

委託事件方法似乎無法將句柄存儲在任何位置,您可能可以爲Event.delegate創建補丁替換,該替換存儲針對委託元素的句柄。修補YUI的一個基本的例子:https://gist.github.com/tivac/1424351

未經測試的代碼:

var config = { 
    groups : { 
     patches : { 
      base : "/js/patches/", 
      modules : { 
       "node-event-delegate-patches" : { 
        path : "node-event-delegate.js", 
        condition : { 
         name : "node-event-delegate-patches", 
         trigger : "node-event-delegate", 
         test : function() { return true; } 
        } 
       } 
      } 
     } 
    } 
}; 

YUI.add("node-event-delegate-patches", function(Y) { 
    var L = Y.Lang; 

    Y.Node.prototype.delegate = function(type) { 
     var args = Y.Array(arguments, 0, true), 
      handle, 
      index = (L.isObject(type) && !L.isArray(type)) ? 1 : 2; 
     args.splice(index, 0, this._node); 

     if (!L.isArray(this._node._delegate_event_handles)){ 
      this._node._delegate_event_handles = []; 
     } 
     handle = Y.delegate.apply(Y, args); 
     this._node._delegate_event_handles.push(handle); 
     return handle; 
    }; 

    Y.Node.prototype.detachDelegates = function(){ 
     Y.Array.each(this._node._delegate_event_handles, function(handle){ 
      handle.detach(); 
     }); 
    } 
});