Obecnie próbuję napisać JavaScript, aby uzyskać atrybut klikniętej klasy. Wiem, że aby to zrobić poprawnie, powinienem użyć detektora zdarzeń. Mój kod jest następujący:
var classname = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
classname.addEventListener('click', myFunction(), false);
Spodziewałem się, że za każdym razem, gdy kliknę jedną z klas, pojawi się okno z ostrzeżeniem, aby podać mi atrybut, ale niestety to nie działa. Czy ktoś może pomóc?
( Uwaga - mogę dość łatwo to zrobić, jQuery
ale NIE chciałbym tego używać )
javascript
dom-events
30secondstosam
źródło
źródło
Odpowiedzi:
To powinno działać.
getElementsByClassName
zwracatablicęObiekt podobny dotablicy(patrz edycja) elementów spełniających kryteria.jQuery wykonuje dla ciebie część zapętlającą, którą musisz zrobić w zwykłym JavaScript.
Jeśli masz obsługę ES6 , możesz zastąpić swój ostatni wiersz:
Uwaga: starsze przeglądarki (takie jak IE6, IE7, IE8) nie obsługują
getElementsByClassName
i dlatego zwracająundefined
.EDYCJA: Korekta
getElementsByClassName
nie zwraca tablicy, ale w większości HTMLCollection lub NodeList w niektórych przeglądarkach ( ref . Mozilla ). Oba typy są podobne do macierzy (co oznacza, że mają właściwość length, a do obiektów można uzyskać dostęp poprzez ich indeks), ale nie są ściśle tablicą ani nie są dziedziczone z macierzy. (co oznacza, że innych metod, które można wykonać na tablicy, nie można wykonać na tych typach)Dziękuję użytkownikowi @ Nemo za zwrócenie na to uwagi i zachęcenie mnie do pełnego zrozumienia.
źródło
document.getElementsByClassName
faktycznie zawsze zwraca tablicę, nawet jeśli tylko jeden element spełnia kryteriaArray.from()
ma drugi parametr, który jest funkcją mapy, więc powyższe (przy założeniu obsługi ES6) można zapisaćArray.from(classname, c => c.addEventListener('click', myFunction));
.* Zostało to zmodyfikowane, aby umożliwić dzieciom klasy docelowej wyzwalanie zdarzeń. Szczegóły znajdują się u dołu odpowiedzi. *
Alternatywna odpowiedź na dodanie detektora zdarzeń do klasy, w której elementy są często dodawane i usuwane. Jest to zainspirowane
on
funkcją jQuery, w której można przekazać selektor elementu potomnego, którego słucha zdarzenie.Fiddle: https://jsfiddle.net/u6oje7af/94/
Spowoduje to nasłuchiwanie kliknięć
base
elementów podrzędnych elementu, a jeśli element docelowy kliknięcia ma element nadrzędny pasujący do selektora, zdarzenie klasy zostanie obsłużone. Możesz dodawać i usuwać elementy, jak chcesz, bez konieczności dodawania kolejnych detektorów kliknięć do poszczególnych elementów. Spowoduje to złapanie ich wszystkich nawet dla elementów dodanych po dodaniu tego detektora, podobnie jak funkcjonalność jQuery (która, jak sądzę, jest nieco podobna pod maską).Zależy to od propagowania wydarzeń, więc jeśli zdarzy
stopPropagation
się to w innym miejscu, może to nie działać. Ponadtoclosest
funkcja najwyraźniej ma pewne problemy ze zgodnością z IE (co nie?).Można to zmienić w funkcję, jeśli trzeba wykonywać tego typu czynności wielokrotnie, np
=========================================
EDYCJA: Ten post pierwotnie używał
matches
funkcji Elementy DOM w celu zdarzenia, ale ograniczyło to cele zdarzenia tylko do klasy bezpośredniej. Zostało zaktualizowane, abyclosest
zamiast tego używało tej funkcji, umożliwiając również wywoływanie zdarzeń na dzieciach pożądanej klasy. Oryginalnymatches
kod można znaleźć na oryginalnym skrzypcach: https://jsfiddle.net/u6oje7af/23/źródło
Możesz użyć kodu poniżej:
źródło
evt.target.classList.contains('databox')
Dzięki nowoczesnemu JavaScriptowi można to zrobić w następujący sposób:
event.target
do pobierania dodatkowych informacji dla określonego elementuźródło