通过事件监听器获取元素

时间:2016-08-19 09:07:03

标签: javascript jquery

有没有办法让所有具有特定事件监听器的元素都附加到它们身上?

我知道如果将事件监听器定义为属性,我可以得到它们:

var allElemsInBodyWithOnclickAttr = $("body").find("*[onclick]");

但是我的元素具有通过代码附加的事件监听器,因此没有onclick属性。

所以当我这样做时(例如):

$("a").on("click", function(evt) { 
    alert("Hello"); 
});

..然后使用下面的代码不会触发那些锚元素的点击:

$("a[onclick]").trigger("click");

我想我可以循环遍历所有元素并检查他们是否有我正在寻找的监听器(使用this SO question)但是我无法想象它会表现得非常好......

2 个答案:

答案 0 :(得分:1)

我认为这是不可能的,因为无法测试单个元素是否附加了事件监听器。

here

因此,唯一的方法是管理一个地图,其中包含对每个元素的每个事件的每个事件处理程序的引用。

修改

关于@Ivan Shmidt的答案,我必须纠正我的答案:显然,它可以与jQuery一起使用。这是因为jQuery持有附加事件处理程序的引用,使用旧的.addEventListener()附加的 BUT 事件会绕过这个并且也不会以这种方式找到。

答案 1 :(得分:1)

无法添加评论,但仍然 - 考虑使用https://github.com/ftlabs/fastclick来消除延迟。

当我使用cordova开发应用程序时,这帮助了我。

另外,没有注意到你已经提到过this post,所以我已经编写了“循环遍历所有元素”的解决方案类型

Array.prototype.reduce.call(
    $('body').children(),
    (answer, node) => {
        if (typeof $._data($(node)[0], 'events') != 'undefined') {
            answer.push(node);
        }
        return answer;
    },
    []
);