Usando apenas JavaScript, qual é a maneira mais eficiente de selecionar todos os elementos DOM que possuem um determinado data-
atributo (digamos data-foo
). Os elementos podem ser diferentes elementos de tag.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
javascript
html
dom
DrANoel
fonte
fonte
document.querySelectorAll
não funciona no IE7. Você teria que criar um script de fallback que percorresse a árvore DOM e verificasse o atributo em cada tag (na verdade, eu não tenho ideia de quão rápidoquerySelectorAll
é, e iria para a verificação manual de tags).data-
elementos, ou seja:data-foo=0
edata-bar=1
edata-app="js"
edata-date="20181231"
Respostas:
Você pode usar querySelectorAll :
fonte
você receberá todos os elementos com esse atributo.
você receberá apenas aqueles com o valor 1.
fonte
.querySelectorAll()
retorna aNodeList
. Conforme observado nessa documentação, é possível iterar sobre a coleção usando.forEach()
. Observe que esta é uma solução não-IE: developer.mozilla.org/en-US/docs/Web/API/… . Se você precisar dar suporte ao IE, precisará fazer um loop sobre o NodeList usando umfor
loop regular .Experimente → aqui
fonte
for in
iterará sobre as propriedades de comprimento e item. Em vez disso, usefor of
para iterar sobre as propriedades projetadas para serem iteradasAqui está uma solução interessante: ele usa o mecanismo CSS dos navegadores para adicionar uma propriedade fictícia aos elementos correspondentes ao seletor e, em seguida, avalia o estilo calculado para encontrar os elementos correspondentes:
fonte
Não sei quem me enganou com -1, mas aqui está a prova.
http://jsfiddle.net/D798K/2/
fonte
getElementsByTagName
um*
seletor global ( ) é quebrado nas versões mais antigas do IE. É aqui que uma pesquisa DOM recursiva realiza o trabalho. Também não há propriedade "data-foo" em um ElementNode que é mapeado a partir dodata-foo
atributo. Você está procurando odataset
objeto (ou seja:node.dataset.foo
.Embora não seja tão bonita quanto
querySelectorAll
(que tem uma série de problemas), aqui está uma função muito flexível que repete o DOM e deve funcionar na maioria dos navegadores (antigos e novos). Enquanto o navegador suportar sua condição (por exemplo: atributos de dados), você poderá recuperar o elemento.Para os curiosos: não se preocupe em testar isso vs. QSA no jsPerf. Navegadores como o Opera 11 armazenam em cache a consulta e inclinam os resultados.
Código:
Você pode iniciá-lo com o seguinte:
recurseDOM(document.body, {"1": 1});
por velocidade, ou apenasrecurseDOM(document.body);
Exemplo com sua especificação: http://jsbin.com/unajot/1/edit
Exemplo com especificação diferente: http://jsbin.com/unajot/2/edit
fonte
querySelectorAll
?querySelectorAll
api