Encontre um elemento no DOM com base em um valor de atributo

252

Você pode me dizer se existe alguma API DOM que procure por um elemento com determinado nome de atributo e valor de atributo:

Algo como:

doc.findElementByAttribute("myAttribute", "aValue");
Michael
fonte
1
Duplicar se você estiver procurando por um Jquery Sol: stackoverflow.com/questions/696968/…
Rajat
13
Você pode atualizar a resposta aceita para a solução moderna, a resposta da Wojtek?
Nick Craver

Respostas:

165

Atualização: Nos últimos anos, o cenário mudou drasticamente. Agora você pode usar com segurança querySelectore querySelectorAll, consulte a resposta da Wojtek para saber como fazer isso.

Não há necessidade de uma dependência do jQuery agora. Se você estiver usando jQuery, ótimo ... se não estiver, não precisará mais confiar apenas na seleção de elementos por atributos.


Não há uma maneira muito curta de fazer isso em javascript vanilla, mas existem algumas soluções disponíveis.

Você faz algo assim, percorrendo elementos e verificando o atributo

Se uma biblioteca como o jQuery for uma opção, você poderá fazê-lo um pouco mais fácil, assim:

$("[myAttribute=value]")

Se o valor não for um identificador CSS válido (possui espaços ou pontuação, etc.), você precisará de aspas ao redor do valor (elas podem ser únicas ou duplas):

$("[myAttribute='my value']")

Você também pode fazer start-with, ends-with, contains, etc ... existem várias opções para o seletor de atributo .

Nick Craver
fonte
6
Na verdade baunilha JavaScript DOM API funciona muito bem em navegadores modernos
Wojtek Kruszewski
2
@WojtekKruszewski não em 2010 :) Eu atualizei, porém, espero que o solicitante mova a aceitação para nós - queremos informações atualizadas por aí.
Nick Craver
1
Eu acho que o jQuery (ou equivalente) é provavelmente o mais fácil, especialmente para ser compatível com vários navegadores sem precisar saber o que isso exige.
Alexis Wilke
1
Eu continuo recebendo uma matriz vazia! Estou tentando pegar um SVG por seu atributo d e estou tentando $ ("[d = path]"); onde 'path' é uma variável que contém o atributo d específico que eu preciso. Alguém já tentou fazer isso com caminhos svg?
tx291
438

Navegadores modernos oferecem suporte nativo querySelectorAllpara que você possa:

document.querySelectorAll('[data-foo="value"]');

https://developer.mozilla.org/en-US/docs/Web/API/Document.querySelectorAll

Detalhes sobre a compatibilidade do navegador:

Você pode usar o jQuery para oferecer suporte a navegadores obsoletos (IE9 e anteriores):

$('[data-foo="value"]');
Wojtek Kruszewski
fonte
2
a fim de concretizar a definição "moderno": caniuse.com/#search=querySelectorAll
Serhio
Parece que o valor não pode ser um número ouSyntaxError: An invalid or illegal string was specified
jeum
3
O seletor deve ser:'[data-foo="value"]'
Yotam Omer 25/02
1
Alguma nota sobre desempenho? Isso é mais rápido do que a iteração em todos os nós?
Stepan Yakovenko
1
O que é "data-foo" ... e para onde foi 'myAttribute' neste exemplo?
oo_dev 17/12/19
38

Podemos usar seletor de atributo no DOM usando document.querySelector()e document.querySelectorAll()métodos.

para o seu:

document.querySelector("selector[myAttribute='aValue']");

e usando querySlectorAll():

document.querySelectorAll("selector[myAttribute='aValue']");

Nos métodos querySelector()e querySelectorAll()podemos selecionar objetos como selecionamos em "CSS".

Mais sobre os seletores de atributos "CSS" em https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors

Naveen Pantra
fonte
Eu tive que remover aspas internas como este document.querySelectorAll ("selector [myAttribute = aValue]");
Matjaz Hirsman 21/03
20
FindByAttributeValue("Attribute-Name", "Attribute-Value");   

ps se você souber o tipo exato de elemento, adicione o terceiro parâmetro (ou seja div, a, p ...etc...):

FindByAttributeValue("Attribute-Name", "Attribute-Value", "div");   

mas, a princípio, defina esta função:

function FindByAttributeValue(attribute, value, element_type)    {
  element_type = element_type || "*";
  var All = document.getElementsByTagName(element_type);
  for (var i = 0; i < All.length; i++)       {
    if (All[i].getAttribute(attribute) == value) { return All[i]; }
  }
}

ps atualizado por recomendações de comentários.

T.Todua
fonte
6
Por quê ?! Você está looping todo o seu DOM, fazendo isso
Arthur
3
Isso parece ótimo - se você tiver apenas 5 elementos na página.
Sheriffderek
2
document.querySelectorAll('[data-foo="value"]');como proposto por @Wojtek Kruszewski no awnser aceito.
Arthur
7

Aqui está um exemplo, Como procurar imagens em um documento pelo atributo src:

document.querySelectorAll("img[src='https://pbs.twimg.com/profile_images/........jpg']");
KhaledDev
fonte
0

Use seletores de consulta, exemplos:

document.querySelectorAll(' input[name], [id|=view], [class~=button] ')

input[name]Insere elementos com namepropriedade.

[id|=view]Elementos com ID que começam com view-.

[class~=button]Elementos com a buttonclasse.

Daniel De León
fonte