Event currentTarget to the rescue

A really quick tip to hopefully save you from throwing your computer out of the window due to JavaScript events.


If you’ve attached an event to an element and queried the event target inside its event handler, you’ve probably found that if there are child elements, they can end up being the event target.

I’m talking about this sort of thing:

Code language
html
<button>
  <span>A label</span>
  <svg><!-- Icon --></svg>
</button>
Code language
js
document.querySelector('button').addEventListener(evt => {
  console.log(evt.target);
});

The problem is, you might have some data attributes on the button itself that you want to access like this:

Code language
html
<button data-something="hello">
  <span>A label</span>
  <svg><!-- Icon --></svg>
</button>
Code language
js
document.querySelector('button').addEventListener(evt => {
  console.log(evt.target.getAttribute('data-something'));
});

If the pointer, or a person’s finger hits the <svg> or the <span>, you won’t get access to data-something and at after lots of debugging and head scratching, you might be tempted to throw your computer out of the window.

Step up currentTarget permalink

There is a solution, though: currentTarget! This will always refer to the element which you attached the event to, so update your JS code to look like this instead:

Code language
js
document.querySelector('button').addEventListener(evt => {
  console.log(evt.currentTarget.getAttribute('data-something'));
});

Wrapping up permalink

Was this post written after I spent an embarrassing amount of time debugging some JavaScript? Yes.

Will it help you not do the same in the future? I really hope so…