2014-07-14 19 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; 
}