Как правильно навесить обработчик при помощи addEventListener?

Добрый вечер!
В коде ниже, я делаю по клику на элемент добавление класса, но получаю вот такую ошибку:
Cannot read property 'add' of undefined
Как я понял, проблема в .bind, потому что без него, все обработчики выполняются, но не по нажатию, а сразу.
Как починить?
Спасибо!
var clickToOrder, elem, i, len, select;

clickToOrder = function(elem) {
  return elem.classList.add('active');
};

select = document.querySelectorAll('.jsCart');

for (i = 0, len = select.length; i < len; i++) {
  elem = select[i];
  elem.addEventListener('click', clickToOrder.bind(elem));
}

upd: elem в clickToOrder:
MouseEvent {dataTransfer: null, which: 1, toElement: ........
  • Вопрос задан
  • 768 просмотров
Решения вопроса 2
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Первый аргумент в обработчике — ссылка на событие.

function clickToOrder (e) {
	e.target.classList.add('active');
	console.log(this); // а это тот же e.target — вы же зачем-то вызывали bind()
};

Обычно привязывают какой-то абстрактный объект, ведь ссылка на узел, где зарегистрирован слушатель события, и так доступна.
Пример
Ответ написан
Ваша проблема в том, что у вас при клике в функцию clickToOrder передаётся объект "событие", а не элемент, на котором был совершен клик.

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

Например, в вашем случае такое:
MouseEvent {dataTransfer: null, which: 1, toElement: div.jsCart, fromElement: null, y: 15…}


В итоге должно получиться как-то так:
(function() {
  var selectEls = document.querySelectorAll('.jsCart');

  var clickToOrder = function(event) {
    console.log(event);
    event.target.classList.add('active');
  };

  for (var i = 0; i < selectEls.length; i++) {
    var item = selectEls[i];
    item.addEventListener('click', clickToOrder);
  }
})();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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