Atualmente, estou tentando escrever JavaScript para obter o atributo da classe que foi clicada. Eu sei que, para fazer isso da maneira correta, devo usar um ouvinte de evento. Meu código é o seguinte:
var classname = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
classname.addEventListener('click', myFunction(), false);
Eu esperava receber uma caixa de alerta toda vez que clicar em uma das classes para me informar o atributo, mas infelizmente isso não funciona. Alguém pode ajudar por favor?
( Observação - eu posso fazer isso facilmente, jQuery
mas NÃO gostaria de usá-lo )
javascript
dom-events
30secondstosam
fonte
fonte
Respostas:
Isso deve funcionar.
getElementsByClassName
retorna um objeto Array-likearray(consulte editar) dos elementos que correspondem aos critérios.O jQuery faz a parte em loop para você, o que você precisa fazer em JavaScript simples.
Se você tiver suporte para ES6, poderá substituir sua última linha por:
Nota: Navegadores mais antigos (como IE6, IE7, IE8) não suportam
getElementsByClassName
e, portanto, retornamundefined
.EDIT: Correção
getElementsByClassName
não retorna uma matriz, mas uma coleção HTMLC na maioria ou uma NodeList em alguns navegadores ( ref Mozilla ). Esses dois tipos são do tipo Array (o que significa que eles têm uma propriedade length e os objetos podem ser acessados por meio de seu índice), mas não são estritamente um Array ou herdados de um Array. (ou seja, outros métodos que podem ser executados em uma matriz não podem ser executados nesses tipos)Agradeço ao usuário @ Nemo por apontar isso e fazer com que eu entenda para entender completamente.
fonte
document.getElementsByClassName
na verdade sempre retornar um array, mesmo que apenas um elemento corresponde aos critériosArray.from()
possui um segundo parâmetro, que é uma função de mapa, para que o acima (assumindo suporte ao es6) possa ser gravadoArray.from(classname, c => c.addEventListener('click', myFunction));
.* Isso foi editado para permitir que filhos da classe de destino acionem os eventos. Veja a parte inferior da resposta para obter detalhes. *
Uma resposta alternativa para adicionar um ouvinte de evento a uma classe em que itens são frequentemente adicionados e removidos. Isso é inspirado na
on
função do jQuery, na qual você pode passar um seletor para um elemento filho que o evento está ouvindo.Fiddle: https://jsfiddle.net/u6oje7af/94/
Isso escutará cliques nos filhos do
base
elemento e, se o destino de um clique tiver um pai correspondente ao seletor, o evento da classe será tratado. Você pode adicionar e remover elementos como desejar, sem precisar adicionar mais ouvintes de clique aos elementos individuais. Isso irá capturá-los todos, mesmo para os elementos adicionados após a adição deste ouvinte, assim como a funcionalidade do jQuery (que eu imagino ser um pouco semelhante ao fundo).Isso depende da propagação dos eventos; portanto, se você estiver
stopPropagation
no evento em outro lugar, isso pode não funcionar. Além disso, aclosest
função tem alguns problemas de compatibilidade com o IE aparentemente (o que não acontece?).Isso pode ser transformado em uma função se você precisar executar esse tipo de ação ouvindo repetidamente, como
=========================================
EDIT: Esta postagem originalmente usou a
matches
função para Elementos DOM no destino do evento, mas isso restringiu os destinos dos eventos apenas à classe direta. Foi atualizada para usar aclosest
função, permitindo que eventos em filhos da classe desejada também acionem os eventos. Omatches
código original pode ser encontrado no violino original: https://jsfiddle.net/u6oje7af/23/fonte
Você pode usar o código abaixo:
fonte
evt.target.classList.contains('databox')
Com o JavaScript moderno, isso pode ser feito assim:
event.target
para recuperar mais informações para um elemento específicofonte