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 jQuery
pero NO me gustaría usarlo )
javascript
dom-events
30secondstosam
fuente
fuente
Respuestas:
Esto debería funcionar.
getElementsByClassName
devuelve 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,
getElementsByClassName
por lo que regresanundefined
.EDITAR: Corrección
getElementsByClassName
no 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.getElementsByClassName
en 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
on
funció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
base
elementos 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á
stopPropagation
en el evento en otro lugar, esto puede no funcionar. Además, laclosest
funció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
matches
funció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 laclosest
función en su lugar, permitiendo que los eventos en los hijos de la clase deseada también activen los eventos. Elmatches
có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.target
para recuperar más información para un elemento específicofuente