J3STER
J3STER

Reputation: 1075

Event Listeners Efficiency

How do event listeners in any programming language actually work internally? The point of this post is to get an overall idea of how event listeners in general work. A while back, when I first started playing with Javascript and Html, every time I needed to create a button to perform an action, lets say execute function 'my_func();', I would simply go...

<button onclick="my_func();">Click me</button>

That is just wonderful, a button, staying idle for the majority of the time, except when clicked. Then, it would execute the corresponding function.


Then I came across Event Listeners. Basically, an event listener is a procedure or function in a computer program that waits for an event to occur. The first thing that came into my mind was the following: When you create an event listener, does that basically just create an infinite loop that checks whether something has been triggered or not? Isn't this inefficient if you have dozens or hundreds of events to listen for? Hundreds of loops checking for a different specific condition every second? Why would you use this instead of the beautiful 'onclick'?


I will proceed to post the answers that I found, (not in StackOverflow, that's why I decided to post it here, so as to enlarge the already vast content of this site). This answer, of all the ones I read, was the one that convinced me the most. However, if you know something that you think would add to the topic, feel free to share your knowledge (the more the better).

Upvotes: 2

Views: 3226

Answers (4)

user7465718
user7465718

Reputation:


  • For practical purposes, there is no difference between the 'onclick' and the 'EventListener' attributes. All in all, that's just what they are, attributes that you add or remove from a specific object. As a consequences, since they are attributes, not mere methods, they do not loop themselves, but instead serve as parameters for the "general event loop" that constantly occur in your window. Hence the lack of difference in efficiency.

  • However, if you have a ton of event listeners, or onclick attributes on a ton of different objects, it may reduce the overall execution speed, as the general loop has to go through more elements to check, for a specific occurred event, if there is anything listening to it; but this happens indistinctelly of how you address your events (with a listener, onclick attributes, etc.)

  • So, I will conclude by saying that there is no practical difference in the way these event handlers are processed. When a particular event is sent to an element, the browser looks up on its attributes and/or list of listeners related to that particular event, and executes each one of them. There's no difference in efficiency between them. The only infinite loop is the "general window loop" or the main event loop, which is processes all the events that happen, and looks for the appropriate object to check for any handlers related to that event, and should any be found, it calls the function attached to them.

Upvotes: 0

Abana Clara
Abana Clara

Reputation: 4650

As what others have said, internally there is no difference between the two. But using the addEventListener() method you can easily attach multiple functions on a single event rather than going through concatenations when you have lots of scripts.

with addEventListener()

Script 1

myEle.addEventLister('click', myFunc);

Script 2

myEle.addEventLister('click', myFunc2);

You see how easy it is to attach functions on an element's event.

using setAttribute()

Script 1

myEle.setAttribute('onclick', myFunc);

Script 2

myEle.setAttribute('onclick', myEle.getAttribute('onclick') + myFunc2);

The extra code is a bit of a hassle

Upvotes: 1

Barmar
Barmar

Reputation: 780787

There's very little difference between running an event handler from onclick and from addEventListener. In both cases, it simply attaches the handler to the DOM element in question. The only significant difference between them is that you can only have one onclick attribute, but every time you call addEventListener() it adds to the list of listeners on that element -- internally there's an array of listeners that addEventListener() pushes onto.

But the way these event handlers are processed is essentially the same. When a click event is sent to an element, the browser looks up its onclick attribute and list of click listeners, and executes all of them. There's no difference in efficiency between them. The only infinite loop is the browser's main event loop, which is processing all events that are received from the OS, finding the appropriate DOM elements, seeing if they have handlers for that event, and calling the handlers.

Upvotes: 3

J3STER
J3STER

Reputation: 1075

The core question was the following: Isn't this inefficient if you have dozens or hundreds of events to listen for?

And the truth is, if that was the case, it would be really inefficient. That is why it doesn't work that way. The program (in the case of Java), or browser (in the case of Javascript), receives events from the operating system every time something happens — when the mouse is moved, when a key is pressed, when the window is resized, when a timer event expires, and so on. For each of those events, the browser needs to figure out if an event handler needs to be dispatched. For example, on a mouse left button down event, it needs to take the coordinates of the mouse and figure out what elements are underneath it, and then check if there are any event listeners registered for those events, and if so add them to the event queue to be executed the next time the engine becomes free.


Once again, feel free to add information, or correct me if you think there is something wrong or somehow inaccurate.

Upvotes: 2

Related Questions