REJH
REJH

Reputation: 3275

Get elements by event listener

Is there a way to get all elements that have a certain event listener attached to them?

I know I can get them if the event listener is defined as an attribute:

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

But I have elements that have event listeners that are attached by code and thus have no onclick attribute.

So when I do (for example) this:

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

..then using the code below doesn't fire the click on those anchor elements:

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

I guess I could loop through all the elements and check if they have the listener I'm looking for (using this SO question) but I can't imagine that's going to perform very well..

Upvotes: 0

Views: 328

Answers (2)

philipp
philipp

Reputation: 16495

I think this is not possible, since it is not possible to test if a single element has an event listener attached to it.

Look here

So the only way to do that is to manage a map which contains a reference to each event handler for each event for each element.

Edit

With respect to the answer of @Ivan Shmidt, I must correct my answer: Obviously It seams to be possible with jQuery. That is because jQuery is holding a reference of attached event handlers, BUT events attached using good old .addEventListener() would bypass this and also not be found this way.

Upvotes: 1

Ivan Shmidt
Ivan Shmidt

Reputation: 173

Can't add comments, but still - consider using https://github.com/ftlabs/fastclick for removing the delay.

That helped me, when i was developing app using cordova.

Also, didn't notice you have already mentioned this post, so i have written implementation for 'loop through all elements'-type-of-solution

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

Upvotes: 1

Related Questions