В настоящее время я пытаюсь написать JavaScript, чтобы получить атрибут класса, по которому щелкнули. Я знаю, что для того, чтобы сделать это правильно, я должен использовать прослушиватель событий. Мой код выглядит следующим образом:
var classname = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
classname.addEventListener('click', myFunction(), false);
Я ожидал получать окно с предупреждением каждый раз, когда нажимал на один из классов, чтобы сообщить мне атрибут, но, к сожалению, это не работает. Может кто-нибудь помочь, пожалуйста?
( Примечание - я могу довольно легко это сделать, jQuery
но я НЕ хотел бы его использовать )
javascript
dom-events
30secondstosam
источник
источник
Ответы:
Это должно работать.
getElementsByClassName
возвращаетмассивArray-подобный объект (см. редактирование) элементов, соответствующих критериям.jQuery делает за вас циклическую часть, которую вам нужно сделать на простом JavaScript.
Если у вас есть поддержка ES6, вы можете заменить свою последнюю строку на:
Примечание. Старые браузеры (например, IE6, IE7, IE8) не поддерживают
getElementsByClassName
и возвращаютсяundefined
.РЕДАКТИРОВАТЬ: Исправление
getElementsByClassName
не возвращает массив, но HTMLCollection в большинстве или NodeList в некоторых браузерах ( ссылка на Mozilla ). Оба эти типа являются Array-Like (что означает, что они имеют свойство length и объекты могут быть доступны через их индекс), но не являются строго Array или наследуются от Array. (имеется в виду, что другие методы, которые могут быть выполнены на массиве, не могут быть выполнены для этих типов)Спасибо пользователю @ Nemo за указание на это и за то, что я закопался, чтобы полностью понять.
источник
document.getElementsByClassName
фактически всегда возвращает массив, даже если только один элемент соответствует критериямArray.from()
имеет второй параметр, который является функцией отображения, поэтому вышеприведенное (при условии поддержки es6) можно записатьArray.from(classname, c => c.addEventListener('click', myFunction));
.* Это было отредактировано, чтобы позволить детям целевого класса вызывать события. Смотрите в нижней части ответа для деталей. *
Альтернативный ответ для добавления прослушивателя событий в класс, где элементы часто добавляются и удаляются. Это вдохновлено
on
функцией jQuery, где вы можете передать селектор для дочернего элемента, который прослушивает событие.Скрипка: https://jsfiddle.net/u6oje7af/94/
Это будет прослушивать щелчки на дочерних
base
элементах, и если у цели щелчка есть родительский элемент, соответствующий селектору, событие класса будет обработано. Вы можете добавлять и удалять элементы по своему усмотрению, не добавляя больше слушателей кликов к отдельным элементам. Это поймает их всех даже для элементов, добавленных после того, как этот слушатель был добавлен, точно так же как функциональность jQuery (который я представляю себе несколько похожим внутри).Это зависит от распространяющихся событий, поэтому, если вы находитесь
stopPropagation
на событии где-то еще, это может не сработать. Кроме того,closest
функция имеет некоторые проблемы с совместимостью с IE, по-видимому (что нет?).Это может быть превращено в функцию, если вам нужно многократно прослушивать действия, например
================================================
РЕДАКТИРОВАТЬ: Этот пост первоначально использовал
matches
функцию для Элементы DOM на цели события, но это ограничивало цели событий только прямым классом. Он был обновлен для использованияclosest
функции вместо этого, что позволяет событиям дочернего класса желаемого класса также инициировать события. Оригинальныйmatches
код можно найти на оригинальной скрипке: https://jsfiddle.net/u6oje7af/23/источник
Вы можете использовать код ниже:
источник
evt.target.classList.contains('databox')
С современным JavaScript это можно сделать так:
event.target
для получения дополнительной информации для конкретного элементаисточник