Actualmente estoy tratando de escribir JavaScript para obtener el atributo de la clase en la que se ha hecho clic. Sé que para hacer esto de la manera correcta, debería usar un detector de eventos. Mi código es el siguiente:
var classname = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
classname.addEventListener('click', myFunction(), false);
Esperaba recibir un cuadro de alerta cada vez que hacía clic en una de las clases para decirme el atributo, pero desafortunadamente esto no funciona. ¿Alguien puede ayudar por favor?
( Nota : puedo hacer esto con bastante facilidad jQuerypero NO me gustaría usarlo )
javascript
dom-events
30secondstosam
fuente
fuente

Respuestas:
Esto debería funcionar.
getElementsByClassNamedevuelve un objeto tipomatriz dematriz (ver edición) de los elementos que coinciden con los criterios.jQuery hace la parte de bucle por usted, que debe hacer en JavaScript simple.
Si tiene soporte para ES6 , puede reemplazar su última línea con:
Nota: los navegadores más antiguos (como IE6, IE7, IE8) no son compatibles,
getElementsByClassNamepor lo que regresanundefined.EDITAR: Corrección
getElementsByClassNameno devuelve una matriz, sino una colección HTMLC en la mayoría, o una NodeList en algunos navegadores ( referencia de Mozilla ). Ambos tipos son Array-Like, (lo que significa que tienen una propiedad de longitud y se puede acceder a los objetos a través de su índice), pero no son estrictamente un Array o se heredan de un Array. (lo que significa que otros métodos que se pueden realizar en una matriz no se pueden realizar en estos tipos)Gracias al usuario @ Nemo por señalar esto y hacerme profundizar para comprenderlo completamente.
fuente
document.getElementsByClassNameen realidad siempre devuelve una matriz, incluso si solo un elemento coincide con los criteriosArray.from()tiene un segundo parámetro que es una función de mapa, por lo que se podría escribir lo anterior (suponiendo que es6 support)Array.from(classname, c => c.addEventListener('click', myFunction));.* Esto fue editado para permitir que los niños de la clase objetivo activen los eventos. Vea la parte inferior de la respuesta para más detalles. * *
Una respuesta alternativa para agregar un detector de eventos a una clase donde los elementos se agregan y eliminan con frecuencia. Esto está inspirado en la
onfunción de jQuery, donde puede pasar un selector para un elemento secundario que el evento está escuchando.Violín: https://jsfiddle.net/u6oje7af/94/
Esto escuchará los clics en los
baseelementos secundarios del elemento y si el objetivo de un clic tiene un elemento primario que coincida con el selector, se manejará el evento de clase. Puede agregar y eliminar elementos como desee sin tener que agregar más oyentes de clics a los elementos individuales. Esto los atrapará a todos incluso para los elementos agregados después de que se agregó este oyente, al igual que la funcionalidad jQuery (que imagino que es algo similar bajo el capó).Esto depende de los eventos que se propagan, por lo que si está
stopPropagationen el evento en otro lugar, esto puede no funcionar. Además, laclosestfunción tiene algunos problemas de compatibilidad con IE aparentemente (¿qué no?).Esto podría convertirse en una función si necesita realizar este tipo de acción escuchando repetidamente, como
=========================================
EDITAR: Esta publicación originalmente utilizó la
matchesfunción para Elementos DOM en el destino del evento, pero esto restringió los destinos de los eventos solo a la clase directa. Se ha actualizado para usar laclosestfunción en su lugar, permitiendo que los eventos en los hijos de la clase deseada también activen los eventos. Elmatchescódigo original se puede encontrar en el violín original: https://jsfiddle.net/u6oje7af/23/fuente
Puedes usar el siguiente código:
fuente
evt.target.classList.contains('databox')Con JavaScript moderno se puede hacer así:
event.targetpara recuperar más información para un elemento específicofuente