@Chekhoved

Как навесить обработчик на коллекцию элементов?

У меня на странице несколько ссылок с одинаковым классом. Мне нужно всем сделать всплывающее окно по нажатию. Пытаюсь им всем отменить действие по умолчанию таким кодом:

var buttonItem = document.querySelectorAll('.button-item');
buttonItem.addEventListener('click', function(event) {
	event.preventDefault();
});


В консоли ошибка: Uncaught TypeError: buttonItem.addEventListener is not a function
Если поиск только 1-го селектора querySelector('.button-item'), то он находится

Пробовал еще так:

var buttonItem = document.getElementsByClassName('.button-item');
buttonItem.addEventListener('click', function(event) {
	event.preventDefault();
});


Та же ошибка.

Как правильно сделать?
  • Вопрос задан
  • 15324 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Проблема в том, что вы пытаетесь навесить обработчик на коллекцию элементов, которая возвращается функцией querySelectorAll. Такой возможности нет, нужно обходить эту коллекцию и навешивать обработчик на каждый элемент отдельно:
var buttonItems = document.querySelectorAll('.button-item'),
    index, button;

for (index = 0; index < buttonItems.length; index++) {
    button = buttonItems[index];
    button.addEventListener('click', function (event) {
        console.log('click');
        event.preventDefault();
    });
}

Пример

Обратите внимание, что такой способ установки обработчика в цикле не очень хорош - при каждой итерации создается новая функция-обработчик, что засоряет память и этот обработчик невозможно потом удалить, поскольку создаваемая функция безымянна и ссылка на нее нигде не сохраняется.
Ну в принципе такой код не очень опрятный.

Лучше делать так:
var buttons = document.querySelectorAll('.button-item'),
    index, button;

for (index = 0; index < buttons.length; index++) {
    button = buttons[index];
    button.addEventListener('click', clickHandler);
    button.addEventListener('dblclick', doubleClickHandler);
}

function clickHandler(event) {
    console.log('click', this.innerText);
    event.preventDefault();
}

function doubleClickHandler(event) {
    console.log('doubleclick', this.innerText);
    this.removeEventListener('click', clickHandler);    
    this.removeEventListener('dblclick', doubleClickHandler);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Bluorenge
Junior front-end developer
Решение в ES6:
const buttonItems = document.querySelectorAll('.button-item');

for (let buttonItem of buttonItems) {
  buttonItem.addEventListener('click', (e) => e.preventDefault());
}

Источник: developer.mozilla

Или ещё лаконичнее:
const buttonItems = document.querySelectorAll('.button-item');

buttonItems.forEach((buttonItem) => buttonItem.addEventListener('click', (e) => e.preventDefault());

Источник: developer.mozilla
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
25 апр. 2024, в 12:03
75000 руб./за проект
25 апр. 2024, в 11:49
25000 руб./за проект
25 апр. 2024, в 11:37
40000 руб./за проект