Все они меняются сразу, потому что вы используете box.forEach()
, чтобы дать им команду изменить все сразу.
Вам следует изменить только поле, которое является target
текущего события щелчка:
let box = document.querySelectorAll('[data-box]');
for (i = 0; i < box.length; i++) {
box[i].addEventListener('click', (e) => {
e.target.style.backgroundColor = "green";
})
}
div.box {
height: 100px;
width: 100px;
margin: 10px;
border: 1px solid black;
}
<div class="box" data-box></div>
<div class="box" data-box></div>
<div class="box" data-box></div>
<div class="box" data-box></div>
В качестве альтернативы можно выполнить итерацию по полям и вызвать прослушиватель событий для текущей цели итерации:
let box = document.querySelectorAll('[data-box]');
box.forEach(b => b.addEventListener('click', () => b.style.backgroundColor = 'green'));
div.box {
height: 100px;
width: 100px;
margin: 10px;
border: 1px solid black;
}
<div class="box" data-box></div>
<div class="box" data-box></div>
<div class="box" data-box></div>
<div class="box" data-box></div>