mccrush
@mccrush
Vue.js Developer

Как из js коллекции обратиться к элементу над которым произошло событие?

На HTML странице есть список с одинаковыми классами. Необходимо чтобы при клике по любому из элементов списка, этот элемент менял фоновый цвет.
<ul>
  <li class="list-group-item">Cras justo odio</li>
  <li class="list-group-item">Dapibus ac facilisis in</li>
  <li class="list-group-item">Morbi leo risus</li>
</ul>

Я могу сохранить коллекцию в переменную, но как потом узнать, по какому именно из элементов совершен клик? Если обращаюсь с индексом "but[1]", то все работает. Естественно, я не могу присвоить свойство всей коллекции. Подскажите, что добавить/исправить в коде?

var but = document.querySelectorAll('.list-group-item');
but.onclick = function() {
	but.style.backgroundColor = 'red';
};
  • Вопрос задан
  • 1635 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Можно ловить клики на элементе body (они «пузырьком» поднимаются наверх), и смотреть, содержит ли класс кликнутого элемента list-group-item:
document.body.addEventListener('click', function(e) {
	if( e.target.classList.contains('list-group-item'))
		e.target.style.backgroundColor = 'red';
});

Fiddle

В отличие от перебора найденных и прикреплении слушателя на каждый, этот способ – «живой»: при появлении в документе новых элементов с искомым классом, клики по ним также отработают.

Вместо <body> можно повесить слушателя ниже, например, на <ul>, чтобы ловить события только в его дочерних элементах (и глубже).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@VyacheslavIny
Можно попробовать с циклом for of, который перебирает элементы коллекции querySelectAll
<ul>
  <li class="list-group-item">Cras justo odio</li>
  <li class="list-group-item">Dapibus ac facilisis in</li>
  <li class="list-group-item">Morbi leo risus</li>
</ul>


let buttons = document.querySelectorAll('.list-group-item');

for (let button of buttons) {
  button.onclick = function() {
    button.style.backgroundColor = 'red';
   }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы