How to addEventListener to multiple elements in a single line

JavascriptDom

Javascript Problem Overview


Example 1:

element1.addEventListener("input", function() {
this function does stuff 
});

Example 2:

element1 && element2.addEventListener("input", function() {
this function does stuff
});

It might not be correct grammatically, but is there a way I can give two elements the same event listener at the same time (same line) instead of having to write them apart?

Javascript Solutions


Solution 1 - Javascript

Well, if you have an array with the elements you could do:

let elementsArray = document.querySelectorAll("whatever");

elementsArray.forEach(function(elem) {
    elem.addEventListener("input", function() {
        //this function does stuff
    });
});

Solution 2 - Javascript

Event Bubbling is the important concept in javascript, so if you can add event on DOM directly, you can save some lines of code, no need for looping :

document.addEventListener('click', function(e){
  if(e.target.tagName=="BUTTON"){
   alert('BUTTON CLICKED');
  }
})

Solution 3 - Javascript

If you don't want to have a separate elementsArray variable defined you could just call forEach from an unnamed array with the two elements.

[ Element1, Element2 ].forEach(function(element) {
   element.addEventListener("input", function() {
      this function does stuff
   });
});

Solution 4 - Javascript

One line

document.querySelectorAll("whatever").forEach(elem => elem.addEventListener("input", fn))

Solution 5 - Javascript

I cannot claim credit for this solution but I found a great solution here.

https://www.kirupa.com/html5/handling_events_for_many_elements.htm

    var theParent = document.querySelector("#theDude");
    theParent.addEventListener("click", doSomething, false);
 
    function doSomething(e) {
        if (e.target !== e.currentTarget) {
            var clickedItem = e.target.id;
            alert("Hello " + clickedItem);
        }
        e.stopPropagation();
    }

Solution 6 - Javascript

Example:

const element1 = document.querySelector("#element1");
const element2 = document.querySelector("#element2");

[element1, element2].map(element => element.addEventListener("click", function() {
  /*some expressions :)*/
}))

Solution 7 - Javascript

If you are using Javascript through Electron and you have a list of buttons, you can use this code to add an EventListener to each button. I'm actually using this method because classical Javascript methods (map(), forEach() ...) weren't supported anymore.

let buttons = document.getElementsByClassName('className');
for(let i = 0; i<buttons.length; i++){
   buttons[i].addEventListener('click', () => {
      /*put your code here*/
   });
}

Solution 8 - Javascript

Maybe it will help you

let all_btn = document.querySelectorAll("button");
all_btn.forEach(function(btn) {
	btn.addEventListener("click", function() {
    	console.log(this.innerHTML + " is clicked")
    });
});

// one line code
// let all_btn=document.querySelectorAll("button");all_btn.forEach(function(n){n.addEventListener("click",function(){console.log(this.innerHTML+" is clicked")})});

<button>button 1</button>
<button>button 2</button>
<button>button 3</button>

Solution 9 - Javascript

The easiest way so far I've learned.

// Get an array of buttons from the page
var buttons = document.querySelectorAll(".btns");

// Loop through the resulting array
for(var i = 0; i < buttons.length; i++){
  buttons[i].addEventListener("click", function() {
    console.log("Hello World");
  });
}

Solution 10 - Javascript

I always recommend delegation - if the inputs are in the same container, then you can do this

window.addEventListener("DOMContentLoaded", function() { // on page load
  document.getElementById("inputContainer").addEventListener("input", function(e) { // passing the event
    const tgt = e.target;
    const id = tgt.id;
    console.log("You typed in",id)
  });
});

<div id="inputContainer">
  <h1>Start typing or paste</h1>
  <input id="element1">
  <input id="element2">
</div>

Solution 11 - Javascript

Example for initializing one unique event listener specific to each element.

You can use the slider to show the values in realtime, or check the console.

On the <input> element I have a attr tag called data-whatever. You can use that to customize each event listener further.

sliders = document.querySelectorAll("input");
sliders.forEach(item=> {
  item.addEventListener('input', (e) => {
    console.log(`${item.getAttribute("data-whatever")} is this value: ${e.target.value}`);
    item.nextElementSibling.textContent = e.target.value;
  });
})

.wrapper {
  display: flex;
}
span {
  padding-right: 30px;
  margin-left: 5px;
}
* {
  font-size: 12px
}

<div class="wrapper">
  <input type="range" min="1" data-whatever="size" max="800" value="50" id="sliderSize">
  <em>50</em>
  <span>Size</span>
  <br>
  <input type="range" min="1" data-whatever="OriginY" max="800" value="50" id="sliderOriginY">
  <em>50</em>
  <span>OriginY</span>
  <br>
  <input type="range" min="1" data-whatever="OriginX" max="800" value="50" id="sliderOriginX">
  <em>50</em>
  <span>OriginX</span>
</div>

Solution 12 - Javascript

If you have a DOM Collection, I suggest you to use the for ... of

In this MDN web doc you can see the details, but, for example, if you have:

HTMLCollection(6) [a.example, a.example, a.example, a.example, a.example, a.example]

You can:

let arrayElements = document.getElementsByClassName('example');
for (let element of arrayElements) {
	element.addEventListener("click", function() {
		console.log('Whoa! You clicked me')
	});

And ta-dah! ;)

Solution 13 - Javascript

Here's what I used to set a click evenhandler on every span in my HTML (each span contains an emoji). When you click it, it will alert the emoji in the sample code.

Array.from(document.querySelectorAll("span")).map(element => element.addEventListener("click", function() {
  alert(element.innerHTML);
}));

div{background: whitesmoke;}
span{ont-size:x-large;
    cursor:pointer;}

<div>
  <span>&#128512;</span>
  <span>&#128513;</span>
  <span>&#128514;</span>
  <span>&#128515;</span>
  <span>&#128516;</span>
  <span>&#128517;</span>
  <span>&#128518;</span>
  <span>&#128519;</span>
  <span>&#128520;</span>
  <span>&#128521;</span>
  <span>&#128522;</span>
  <span>&#128523;</span>
</div>

Solution 14 - Javascript

First include jQuery then after you have included, add this script below.

Html code:

<script>
	$('.greadingButton').on('click', function () {
		$('.greadingButton').removeClass('selected');
		$(this).addClass('selected');
	});
</script>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJamiscoView Question on Stackoverflow
Solution 1 - JavascriptGMaioloView Answer on Stackoverflow
Solution 2 - JavascriptAyush SharmaView Answer on Stackoverflow
Solution 3 - JavascriptJohn AylingView Answer on Stackoverflow
Solution 4 - JavascriptAdrianView Answer on Stackoverflow
Solution 5 - JavascriptdaniellaView Answer on Stackoverflow
Solution 6 - JavascriptNoman GulView Answer on Stackoverflow
Solution 7 - JavascriptMrAnyxView Answer on Stackoverflow
Solution 8 - JavascriptAbdul RehmanView Answer on Stackoverflow
Solution 9 - JavascriptAldrin EspinosaView Answer on Stackoverflow
Solution 10 - JavascriptmplungjanView Answer on Stackoverflow
Solution 11 - JavascriptVincent TangView Answer on Stackoverflow
Solution 12 - Javascriptalex-chamaView Answer on Stackoverflow
Solution 13 - JavascriptraddevusView Answer on Stackoverflow
Solution 14 - JavascriptJenil JView Answer on Stackoverflow