Events and actions or occurrences occur in the system you are programming, which the system tells you so you can respond to it in some way if you wish. For example, if a user clicks a button on a webpage, you might want to respond to an action to display something.
Each available event has an event handler , which is a block of code (usually the JavaScript function you created) that will run when the event is triggered. Note that sometimes it's called event listeners – they are interchangeable for our purposes, although strictly speaking, they work together.
Note: Web events are not part of the core JavaScript language – they are defined as part of the APIs built into the browser.
1. Ways of using web events
There are a few ways we can add event listener code to our website. In this section, we review a few ways and discuss which one we should use.
1.1. Event handler properties
There are many existing properties that contain event handler code we may encounter often:
1 2 3 4 5 6 7 | <span class="token keyword">const</span> btn <span class="token operator">=</span> document <span class="token punctuation">.</span> <span class="token function">querySelector</span> <span class="token punctuation">(</span> <span class="token string">'button'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> btn <span class="token punctuation">.</span> <span class="token function-variable function">onclick</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> rndCol <span class="token operator">=</span> <span class="token string">'rgb('</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">')'</span> <span class="token punctuation">;</span> document <span class="token punctuation">.</span> body <span class="token punctuation">.</span> style <span class="token punctuation">.</span> backgroundColor <span class="token operator">=</span> rndCol <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
The onclick attribute as an example is, in addition to it there are many other properties.
-
btn.onfocus
andbtn.onblur
– The color changes when the button is focused and unfocused; try pressing tab to focus on the button and press tab again to focus away from the button. These are often used to display information about how to fill in form fields when they are focused, or display an error message if a form field has just been filled in with an incorrect value. -
btn.ondblclick
– The color changes only when the button is double-clicked. -
window.onkeypress, window.onkeydown, window.onkeyup
– The color changes when a key is pressed on the keyboard. The keypress event registering to a general press (button down and then up), while keydown and keyup refer to just the key down and key up parts of the keystroke, respectively. Note that it doesn't work if you try to register this event handler on the button itself – we've had to register it on the window object, which represents the entire browser window. -
btn.onmouseover
andbtn.onmouseout
– The color changes when the mouse pointer is moved so it begins hovering over the button, or when pointer stops hovering over the button and moves off of it, respectively.
There are some very common and available events for any element (for example, an onclik
handler can register almost any element), but there are some special attributes that are only useful for certain situations. (for example, onplay
only available with certain tags, like <video>
)
1.2. Inline event handlers – don't use these
You can also see code samples like this in your code:
1 2 3 4 5 6 7 | <span class="token operator"><</span> button onclick <span class="token operator">=</span> <span class="token string">"bgChange()"</span> <span class="token operator">></span> Press me <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> <span class="token keyword">function</span> <span class="token function">bgChange</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> rndCol <span class="token operator">=</span> <span class="token string">'rgb('</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">')'</span> <span class="token punctuation">;</span> document <span class="token punctuation">.</span> body <span class="token punctuation">.</span> style <span class="token punctuation">.</span> backgroundColor <span class="token operator">=</span> rndCol <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Or add JavaScript code directly into properties like for example:
1 2 3 | <span class="token operator"><</span> button onclick <span class="token operator">=</span> <span class="token string">"alert('Hello, this is my old-fashioned event handler!');"</span> <span class="token operator">></span> Press me <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> |
You can find many equivalent HTML properties for many event handler properties, but you shouldn't use it – it's a bad practice . It is really difficult to manage the code and inefficient.
As a beginner, don't mix HTML files with your JS as it is difficult to parse, so all your JS files in another place will be better, you can apply each file. JS with many different HTML files.
Even putting them in a file, inline event handlers are not a good idea. A button is OK, but what happens if there are 100 buttons, you will have to add 100 attributes to the file, then maintaining code will become a nightmare. With JS, you can add an event handler function to all the buttons in the page no matter how many times by using the following:
1 2 3 4 5 6 | <span class="token keyword">const</span> buttons <span class="token operator">=</span> document <span class="token punctuation">.</span> <span class="token function">querySelectorAll</span> <span class="token punctuation">(</span> <span class="token string">'button'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> i <span class="token operator"><</span> buttons <span class="token punctuation">.</span> length <span class="token punctuation">;</span> i <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> buttons <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">.</span> onclick <span class="token operator">=</span> bgChange <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Or another option uses the built-in method forEach
built-in NodeList objects:
1 2 3 4 | buttons <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> button <span class="token punctuation">)</span> <span class="token punctuation">{</span> button <span class="token punctuation">.</span> onclick <span class="token operator">=</span> bgChange <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
1.3. addEventListener()
and removeEventListener()
The latest type of event handler is defined in the DOM level 2 object which provides the browser with a new function addEventListener()
. This function is similar to event handler properties, but the syntax is a bit different
1 2 3 4 5 6 7 8 9 | <span class="token keyword">const</span> btn <span class="token operator">=</span> document <span class="token punctuation">.</span> <span class="token function">querySelector</span> <span class="token punctuation">(</span> <span class="token string">'button'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">bgChange</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> rndCol <span class="token operator">=</span> <span class="token string">'rgb('</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">')'</span> <span class="token punctuation">;</span> document <span class="token punctuation">.</span> body <span class="token punctuation">.</span> style <span class="token punctuation">.</span> backgroundColor <span class="token operator">=</span> rndCol <span class="token punctuation">;</span> <span class="token punctuation">}</span> btn <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">'click'</span> <span class="token punctuation">,</span> bgChange <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
In the function addEventListener()
function, there are two parameters, the name of the event we want to register and the code including the handler function we want to run in response to the event. Note that it is possible to put the entire code in the addEventListener()
function as an anonymous function as follows:
1 2 3 4 5 | btn <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">'click'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> rndCol <span class="token operator">=</span> <span class="token string">'rgb('</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">')'</span> <span class="token punctuation">;</span> document <span class="token punctuation">.</span> body <span class="token punctuation">.</span> style <span class="token punctuation">.</span> backgroundColor <span class="token operator">=</span> rndCol <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
This mechanism has several benefits over the previous two mechanisms. The first is that it has a removeEventListener()
partner function that will remove the previously added listener. The following example will remove the listener added above:
1 2 | btn <span class="token punctuation">.</span> <span class="token function">removeEventListener</span> <span class="token punctuation">(</span> <span class="token string">'click'</span> <span class="token punctuation">,</span> bgChange <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
This doesn't make much sense for small programs, but for larger, more complex programs it can be extremely effective to clean unused event handlers. In addition, for example, this allows you to have the same button perform different actions in different situations – all you have to do is add or delete event handlers.
Second, you can also register multiple handlers for the same listener. The following two handlers cannot be applied:
1 2 3 | myElement <span class="token punctuation">.</span> onclick <span class="token operator">=</span> functionA <span class="token punctuation">;</span> myElement <span class="token punctuation">.</span> onclick <span class="token operator">=</span> functionB <span class="token punctuation">;</span> |
The second line overwrites the onclick value set by the first line. At that time you need
1 2 3 | myElement <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">'click'</span> <span class="token punctuation">,</span> functionA <span class="token punctuation">)</span> <span class="token punctuation">;</span> myElement <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">'click'</span> <span class="token punctuation">,</span> functionB <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Then both functions are executed when the element is clicked.
There are also many other benefits through the event options, you can find out more at its homepage.
1.4. What mechanism should I use?
In all three mechanisms, you should not use HTML event handler attributes, it is outdated, and is a bad practice as mentioned above.
The remaining two are relatively interchangeable, at least for simpler purposes:
- Event handler properties are less powerful and optional but are compatible with the browser (IE8 support). You should start with this mechanism if you are learning JS.
- DOM Level 2 Events (addEventListener (), etc.) is more powerful but also complex and not compatible with many browsers (IE9 support). You should use it when you have experienced.
The main benefit of the third mechanism is that you can delete the event handler code if needed, use removeEventListener()
and add multiple listeners with an event to the element if required. For example, you can call addEventListener('click', function() {...})
on an element multiple times with different functions in the second argument. It is not possible with event handler properties for a few things. assignment in subsequent times will overwrite the previous one, for example:
1 2 3 4 | element <span class="token punctuation">.</span> onclick <span class="token operator">=</span> function1 <span class="token punctuation">;</span> element <span class="token punctuation">.</span> onclick <span class="token operator">=</span> function2 <span class="token punctuation">;</span> etc <span class="token punctuation">.</span> |
Note: If you are required to support browsers older than Internet Explorer 8 in your work, you may have trouble, because these ancient browsers use different event models from the new browsers. than. But never fear, most JavaScript libraries (eg jQuery) have built-in functions that help eliminate differences between browsers. Don't worry about this too much at this stage in your learning journey.
2. Other event concepts
2.1. Event objects
Sometimes we pass an event handler to an object with a name like event
, evt
or simply e
. It is called an event object and it automatically passes to the event handler to add functions and information. For example:
1 2 3 4 5 6 7 8 | <span class="token keyword">function</span> <span class="token function">bgChange</span> <span class="token punctuation">(</span> e <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> rndCol <span class="token operator">=</span> <span class="token string">'rgb('</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">','</span> <span class="token operator">+</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token number">255</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">')'</span> <span class="token punctuation">;</span> e <span class="token punctuation">.</span> target <span class="token punctuation">.</span> style <span class="token punctuation">.</span> backgroundColor <span class="token operator">=</span> rndCol <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> e <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> btn <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">'click'</span> <span class="token punctuation">,</span> bgChange <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
You can view fullcode at https://github.com/mdn/learning-area/blob/master/javascript/building-blocks/events/random-color-eventobject.html
Note: You can use any name you like for the event object – you just need to choose a name that you can then use to reference it inside the event handler function.
e/evt/event
are most commonly used by developers because they are short and easy to remember. It's always good to be consistent – with yourself, and with others if possible.
2.2. Event bubbling and capture
The last topic we want to talk about is something you may not see often but it can really panic if you don't understand. Event bubbling and capture and two mechanisms that describe what happens when two handlers for a connected event are triggered in an element. See the following example to understand it:
Extremely simple example shows and hides 1 <div>
with <video>
inside:
1 2 3 4 5 6 7 8 9 10 | <span class="token operator"><</span> button <span class="token operator">></span> Display video <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"hidden"</span> <span class="token operator">></span> <span class="token operator"><</span> video <span class="token operator">></span> <span class="token operator"><</span> source src <span class="token operator">=</span> <span class="token string">"rabbit320.mp4"</span> type <span class="token operator">=</span> <span class="token string">"video/mp4"</span> <span class="token operator">></span> <span class="token operator"><</span> source src <span class="token operator">=</span> <span class="token string">"rabbit320.webm"</span> type <span class="token operator">=</span> <span class="token string">"video/webm"</span> <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> Your browser doesn't support <span class="token constant">HTML5</span> video <span class="token punctuation">.</span> Here is a <span class="token operator"><</span> a href <span class="token operator">=</span> <span class="token string">"rabbit320.mp4"</span> <span class="token operator">></span> link to the video <span class="token operator"><</span> <span class="token operator">/</span> a <span class="token operator">></span> instead <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> video <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
When you click <button>
, the video will show the view by changing the class attribute in <div>
from hidden to showing:
1 2 3 4 | btn <span class="token punctuation">.</span> <span class="token function-variable function">onclick</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> videoBox <span class="token punctuation">.</span> <span class="token function">setAttribute</span> <span class="token punctuation">(</span> <span class="token string">'class'</span> <span class="token punctuation">,</span> <span class="token string">'showing'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Then there are 2 more onclick event handlers – 1 for <div>
and the second for <video>
. The idea is that when the <div>
area outside the video is clicked, this box will hide, and when the video click, the video will start running:
1 2 3 4 5 6 7 8 | videoBox <span class="token punctuation">.</span> <span class="token function-variable function">onclick</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> videoBox <span class="token punctuation">.</span> <span class="token function">setAttribute</span> <span class="token punctuation">(</span> <span class="token string">'class'</span> <span class="token punctuation">,</span> <span class="token string">'hidden'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> video <span class="token punctuation">.</span> <span class="token function-variable function">onclick</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> video <span class="token punctuation">.</span> <span class="token function">play</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> |
But there was a problem – right now, when you click the video to start running but it is also a <div>
hidden at the same time. That's because <video>
inside the <div>
tag, so when you click the video, it actually runs both events.
2.3. Bubbling and capturing explained
When an event is fired from an element, which has parent elements (such as <video>
has a <div>
tag as a parent), modern browsers will run a different stage: the capturing phase and the bubbling. phase.
In the capturing phase:
- The browser checks if the nearest
<html>
(outer-most ancestor) has an onclick event registered in the capture phase and runs it if available - It then moves into the next element within
<html>
and does the same thing, then continues until it reaches the element that is actually clicked.
In the bubbling phase, the exact opposite occurs:
- The browser will check to see if the component actually clicked has an onclick event handler registered in the effervescent stage, running it if available.
- It then moves into the ancestral element immediately and does the same, continuing on until the
<html>
element
In modern browers, by default all event handlers are registered during the effervescent period. So in the current example, when you click a video, the bubbling event from <video>
will be directed to the <html>
tag. Details will be as follows:
- It finds
video.onclick
… handler and runs it so first the video will start playing - Then search for
videoBox.onclick
… handler and run it, so the video will be hidden
2.4. Fixing the problem with stopPropagation()
This is an annoying behavior but there is a way to fix it. The standard Event object has one available function, stopPropagation()
, when called in an event object handlers, the first handler will run but the event will not bubble again, so no additional handlers will be run. :
1 2 3 4 5 | video <span class="token punctuation">.</span> <span class="token function-variable function">onclick</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> e <span class="token punctuation">)</span> <span class="token punctuation">{</span> e <span class="token punctuation">.</span> <span class="token function">stopPropagation</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> video <span class="token punctuation">.</span> <span class="token function">play</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> |
Note: Why do we care both capturing and bubbling? Well, on a bad day, the browser is less compatible than we have now, Netscape only uses event capturing and Internet Explorer only uses event bubbling. When the W3C decided to try to standardize behavior and reach consensus, they ended up with a system that included both, which is a modern browser implemented.
Note: As mentioned above, by default all event handlers are registered in the bubbling phase and this makes more sense for most of the time. If you really want to register an event in phase capturing, you can register your hanlder by using addEventListener () and setting the third option to true.
2.5. Event delegation: Authorize the event
Bubbling also allows us to take advantage of the event delegation – this concept is based on the fact that if you want some code to run when you click on a large number of child elements, you can set the event listener for their parent and there are events that take place in them more frothy than you may have to set the event listener in each child tag. Remember they said earlier that bubbling involves checking the event element triggered for an event handler first that moves up to its parent element?
A good example is multiple lists of items – if you want each of them to display a message when clicked, you can set the click event listener on the parent <ul>
tag and the event will bubble from each item to <ul>
Even delegation allows you to avoid adding events to each individual node, instead the event listener is added to a parent tag. The event listener parses from the bubbling event to find child tags. The basic concept is quite simple but many people do not understand how the event delegation works. Let me explain
See the UL code snippet with a few tags:
1 2 3 4 5 6 7 8 9 | <span class="token operator"><</span> ul id <span class="token operator">=</span> <span class="token string">"parent-list"</span> <span class="token operator">></span> <span class="token operator"><</span> li id <span class="token operator">=</span> <span class="token string">"post-1"</span> <span class="token operator">></span> Item <span class="token number">1</span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> li id <span class="token operator">=</span> <span class="token string">"post-2"</span> <span class="token operator">></span> Item <span class="token number">2</span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> li id <span class="token operator">=</span> <span class="token string">"post-3"</span> <span class="token operator">></span> Item <span class="token number">3</span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> li id <span class="token operator">=</span> <span class="token string">"post-4"</span> <span class="token operator">></span> Item <span class="token number">4</span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> li id <span class="token operator">=</span> <span class="token string">"post-5"</span> <span class="token operator">></span> Item <span class="token number">5</span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> li id <span class="token operator">=</span> <span class="token string">"post-6"</span> <span class="token operator">></span> Item <span class="token number">6</span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> ul <span class="token operator">></span> |
Now we assign the event to each child tab when clicked. You can add separate event listeners for each individual LI card, but what if LI is often added or deleted? Adding and deleting event listeners will become a nightmare especially when the code adds and deletes in different locations in your application. A good solution to adding an event listener is to add it to the UL parent tag. But if you add the parent tag, do you know which element is clicked?
Simply put: when the event bubbles for the UL element, you will check the target property of the event object to get a reference to the actual clicked node. Here is a basic JavaScrit example that illustrates event delagation :
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">// Get the element, add a click listener...</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">"parent-list"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">"click"</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> e <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// e.target is the clicked element!</span> <span class="token comment">// If it was a list item</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> e <span class="token punctuation">.</span> target <span class="token operator">&&</span> e <span class="token punctuation">.</span> target <span class="token punctuation">.</span> nodeName <span class="token operator">==</span> <span class="token string">"LI"</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// List item found! Output the ID!</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"List item "</span> <span class="token punctuation">,</span> e <span class="token punctuation">.</span> target <span class="token punctuation">.</span> id <span class="token punctuation">.</span> <span class="token function">replace</span> <span class="token punctuation">(</span> <span class="token string">"post-"</span> <span class="token punctuation">,</span> <span class="token string">""</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token string">" was clicked!"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Start by adding 1 click event listener to the parent tag. When the event listener is enabled, check the event element to make sure it is the type of element being captured. If it's a LI element, boom: that's what I need. If not the element we weighed, the event will be ignored. Extremely simple example -UL and LI are straightforward comparisons. Try something more difficult. Consider the parent DIV tag with many children but we only care about 1 label A
with class CSS classA
:
1 2 3 4 5 6 7 8 | <span class="token comment">// Get the parent DIV, add click listener...</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">"myDiv"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">"click"</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> e <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// e.target was the clicked element</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> e <span class="token punctuation">.</span> target <span class="token operator">&&</span> e <span class="token punctuation">.</span> target <span class="token punctuation">.</span> <span class="token function">matches</span> <span class="token punctuation">(</span> <span class="token string">"a.classA"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Anchor element clicked!"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
You can see the Element.matches API here: https://davidwalsh.name/element-matches-selector
Because most developers use JavaScript libraries to handle events and their DOM elements, I recommend using the library's event authorization method, because they have the ability to define delegates and advanced element.
Hopefully the article is helpful for you about the concepts surrounding event authorization and the convenience surrounding the power of this authorization.
summary
- There are 3 general ways to assign an event to a DOM element: assign an attribute, assign an inline or use
addEventListener()
- How
addEventListener()
can assign multiple events to a component, and have a partner,removeEventListener()
deletes the assigned event. - Also when transmitting events there are many components that are transmitted.
- You should understand bubbling and capturing in events, DOMs that handle events according to parent and child tags. Besides take advantage of it with Event delegation
Bubbling also allows us to take advantage of the event delegation – this concept is based on the fact that if you want some code to run when you click on a large number of child elements, you can set the event listener for their parent and there are events that take place in them more frothy than you may have to set the event listener in each child tag.
References:
- Events for 1 website: Event reference
- Introduction to events