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");

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 .


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"]');

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


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.


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']");


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.