2014-07-14 25 views
0

通常得到的是DOM節點上的監聽器,我使用如何找到委派的事件偵聽器?

$('selector').data('events'); 

然而,這並不表明事件偵聽器正在通過委託添加,如

$(document).on('click', 'selector', handlerFunction) 

一個顯而易見的方法是遍歷了DOM樹,看看是否有父母正在委託事件到手邊,同時調用$('selector').parent().data('events'),直到找不到父母爲止,但這並不意味着我是非常有效或標準的做事方式,我認爲這種做法的問題太常見了,沒有更好的解決方案。

如何找到所有的事件偵聽器,包括委託的?

+0

嗯..你究竟在做什麼..?這可能是一個xy問題...... –

+0

我有大量的頁面,甚至有來自各種模塊和其他垃圾(如Jquery mobile ui)和其他恐怖事件的其他恐怖事件被添加到其他恐怖事件中,試圖從中理解。我不認爲是'xy',除非可以讀取像Neo讀取矩陣這樣的代碼,我坦白地說不能:)。 –

+0

向上遍歷DOM是獲取委託偵聽器的唯一方法,這是因爲這些偵聽器不屬於與「selector」匹配的元素,而是元素「$(element)」。所以即使jQuery會提供這樣一個函數,它也需要在內部進行遍歷。 –

回答

0

自動櫃員機我使用下面的功能,而不是優雅 - 但爲我節省了相當一段時間。

var getAllEventListeners = function (options) { 
    if (options.internalArr == undefined) 
     options.internalArr = []; 
    if (options.elements.data('events') != undefined) { 
     options.internalArr.push({ 
      elements: options.elements, 
      events: options.elements.data('events') 
     }); 
    } 
    if (options.elements.parent().length != 0) { 
     getAllEventListeners({ 
      elements: options.elements.parent(), 
      internalArr: options.internalArr 
     }); 
    } 
} 

var findAllListeners = function (selector) { 
    var opt = { 
     elements: $(selector), 
     internalArr: [] 
    }; 
    getAllEventListeners(opt); 
    return opt.internalArr; 
}