Search code examples
javascriptdompublish-subscribeevent-delegation

Vanilla JS event delegation - dealing with child elements of the target element


I'm trying to do event delegation in vanilla JS. I have a button inside a container like this

<div id="quiz">
    <button id="game-again" class="game-again">
        <span class="icon-spinner icon"></span>
        <span>Go again</span>
    </button>
</div>

And following David Walsh's nice instructions I'm adding an event handler to an ancestor of the button like so:

this.container.addEventListener('click', function(e){
    if (e.target && e.target.id == 'game-again') {
        e.stopPropagation();
        self.publish('primo:evento');
    }
});

Where this.container is the #quiz element. This works half the time, but the rest of the time the target of the click event is one of the spans inside the button, so my event handler isn't called. What's the best way to deal with this situation?


Solution

  • Alternate Solution:

    MDN: Pointer events

    Add a class to all nested child elements (.pointer-none)

    .pointer-none {
      pointer-events: none;
    }
    

    Your mark-up becomes

    <div id="quiz">
        <button id="game-again" class="game-again">
            <span class="icon-spinner icon pointer-none"></span>
            <span class="pointer-none">Go again</span>
        </button>
    </div>
    

    With the pointer set to none, the click event wouldn't fire on those elements.

    https://css-tricks.com/slightly-careful-sub-elements-clickable-things/