Encuentra un elemento en DOM basado en un valor de atributo

252

¿Puede decirme si hay alguna API DOM que busque un elemento con un nombre de atributo y un valor de atributo dados:

Algo como:

doc.findElementByAttribute("myAttribute", "aValue");
Miguel
fuente
1
Duplica si estás buscando un Jquery Sol: stackoverflow.com/questions/696968/…
Rajat
13
¿Pueden actualizar la respuesta aceptada a la solución moderna, la respuesta de Wojtek?
Nick Craver

Respuestas:

165

Actualización: en los últimos años, el panorama ha cambiado drásticamente. Ahora puede usar de manera confiable querySelectory querySelectorAll, vea la respuesta de Wojtek sobre cómo hacerlo.

No hay necesidad de una dependencia jQuery ahora. Si está utilizando jQuery, genial ... si no lo está, no necesita confiar en él solo para seleccionar elementos por atributos.


No hay una manera muy corta de hacer esto en JavaScript vainilla, pero hay algunas soluciones disponibles.

Hace algo como esto, recorre elementos y verifica el atributo

Si una biblioteca como jQuery es una opción, puede hacerlo un poco más fácil, así:

$("[myAttribute=value]")

Si el valor no es un identificador CSS válido (tiene espacios o signos de puntuación, etc.), necesita comillas alrededor del valor (pueden ser simples o dobles):

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

También se puede hacer start-with, ends-with, contains, etc ... hay varias opciones para el selector de atributos .

Nick Craver
fuente
66
En realidad vainilla JavaScript DOM API funciona bastante bien en los navegadores modernos
Wojtek Kruszewski
2
@WojtekKruszewski no en 2010 :) Sin embargo, actualicé, espero que el autor de la pregunta mueva la aceptación por nosotros, queremos información actualizada.
Nick Craver
1
Creo que jQuery (o equivalente) es probablemente el más fácil, especialmente para ser compatible con varios navegadores sin tener que saber lo que eso requiere.
Alexis Wilke
1
¡Sigo obteniendo una matriz vacía! Estoy tratando de tomar un SVG por su atributo d, y estoy intentando $ ("[d = ruta]"); donde 'ruta' es una variable que contiene el atributo d específico que necesito. ¿Alguien ha intentado hacer esto con rutas svg?
tx291
438

Los navegadores modernos admiten nativos querySelectorAllpara que pueda hacer:

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

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

Detalles sobre la compatibilidad del navegador:

Puede usar jQuery para admitir navegadores obsoletos (IE9 y anteriores):

$('[data-foo="value"]');
Wojtek Kruszewski
fuente
2
para concretar la definición "moderna": caniuse.com/#search=querySelectorAll
serhio
Parece que el valor no puede ser un número oSyntaxError: An invalid or illegal string was specified
jeum
3
El selector debe ser:'[data-foo="value"]'
Yotam Omer
1
¿Alguna nota sobre el rendimiento? ¿Es esto más rápido que iterar sobre todos los nodos?
Stepan Yakovenko
1
¿Qué es "data-foo" ... y dónde se ha ido 'myAttribute' en este ejemplo?
oo_dev
38

Podemos usar el selector de atributos en DOM usando los métodos document.querySelector()y document.querySelectorAll().

para ti:

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

y usando querySlectorAll():

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

En querySelector()y querySelectorAll()métodos podemos seleccionar objetos como seleccionamos en "CSS".

Más información sobre los selectores de atributos "CSS" en https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors

Naveen Pantra
fuente
Tuve que eliminar las comillas internas como este document.querySelectorAll ("selector [myAttribute = aValue]");
Matjaz Hirsman
20
FindByAttributeValue("Attribute-Name", "Attribute-Value");   

ps si conoce el tipo de elemento exacto, agrega el tercer parámetro (es decir div, a, p ...etc...):

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

pero al principio, defina esta función:

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 actualizado por comentarios recomendaciones.

T.Todua
fuente
66
Por qué ?! Estás haciendo un bucle de todo tu DOM al hacer esto
Arthur
3
Esto parece genial, si solo tiene 5 elementos en la página.
sheriffderek
2
document.querySelectorAll('[data-foo="value"]');según lo propuesto por @Wojtek Kruszewski en el awnser aceptado.
Arthur
7

Aquí hay un ejemplo, Cómo buscar imágenes en un documento por atributo src:

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

Utilice selectores de consulta, ejemplos:

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

input[name]Elementos de entrada con namepropiedad.

[id|=view]Elementos con identificación que comienzan con view-.

[class~=button]Elementos con la buttonclase.

Daniel De León
fuente