【问题标题】:How to find delegated event listeners?如何找到委托的事件监听器?
【发布时间】:2014-07-14 10:03:54
【问题描述】:

通常在我正在使用的那个 DOM 节点上获取侦听器

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

但是,这不会显示通过委托添加的事件侦听器,例如

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

一种明显的方法是向上遍历 DOM 树并查看是否有任何父级将事件委托给手头的元素,同时调用 $('selector').parent().data('events') 直到找不到父级,但这并没有让我觉得非常有效或标准的做事方式,我觉得这种问题太常见了,没有更好的解决方案。

如何找到所有的事件监听器,包括委托的?

【问题讨论】:

  • 嗯..你到底想做什么..?这可能是 xy 问题...
  • 我有大量页面,从各种模块和其他垃圾(如 Jquery 移动 ui)和其他恐怖事件中添加了大量的甚至听众,我正在尝试理解它。我不认为是“xy”,除非有人可以读取像 Neo 读取矩阵这样的代码,坦率地说我不能:)。
  • 向上遍历 DOM 是获取委托侦听器的唯一方法,因为这些侦听器不属于匹配 'selector' 的元素,而是属于元素 $(element)。所以即使 jQuery 会提供这样的功能,它也需要在内部进行遍历。
  • @t.niese 谢谢,我自己也是这么想的,只需要确认没有已知的“开箱即用”解决方案。
  • 所以你需要知道这个来进行调试吗? (委托事件侦听器是个好东西,但它们经常被轻率地使用。特别是如果单页应用程序中编写不好的插件污染了带有委托侦听器的 document 元素。)

标签: javascript jquery jquery-delegate


【解决方案1】:

ATM 我正在​​使用下面的函数,不是很优雅 - 但可以节省我很多时间。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2016-12-25
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2018-03-25
    相关资源
    最近更新 更多