Trouver un élément dans DOM en fonction d'une valeur d'attribut


252

Pouvez-vous me dire s'il existe une API DOM qui recherche un élément avec un nom d'attribut et une valeur d'attribut donnés:

Quelque chose comme:

doc.findElementByAttribute("myAttribute", "aValue");

1
Dupliquez si vous cherchez un Jquery Sol: stackoverflow.com/questions/696968/…
Rajat

13
Pouvez-vous mettre à jour la réponse acceptée à la solution moderne, la réponse de Wojtek?
Nick Craver

Réponses:


165

Mise à jour: Au cours des dernières années, le paysage a radicalement changé. Vous pouvez désormais utiliser de manière fiable querySelectoret querySelectorAll, voir la réponse de Wojtek pour savoir comment procéder.

Il n'y a plus besoin d'une dépendance jQuery maintenant. Si vous utilisez jQuery, tant mieux ... sinon, vous n'avez plus besoin de vous y fier uniquement pour sélectionner des éléments par attributs.


Il n'y a pas de moyen très court de le faire en javascript vanille, mais il existe des solutions disponibles.

Vous faites quelque chose comme ça, en parcourant les éléments et en vérifiant l'attribut

Si une bibliothèque comme jQuery est une option, vous pouvez le faire un peu plus facilement, comme ceci:

$("[myAttribute=value]")

Si la valeur n'est pas un identifiant CSS valide (elle contient des espaces ou de la ponctuation, etc.), vous avez besoin de guillemets autour de la valeur (ils peuvent être simples ou doubles):

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

Vous pouvez également faire start-with, ends-with, contains, etc ... il y a plusieurs options pour le sélecteur d'attribut .


6
En fait, l'API DOM JavaScript vanille fonctionne plutôt bien sur les navigateurs modernes
Wojtek Kruszewski

2
@WojtekKruszewski pas en 2010 :) J'ai mis à jour cependant, j'espère que le demandeur déplacera l'acceptation pour nous - nous voulons des informations actuelles.
Nick Craver

1
Je pense que jQuery (ou équivalent) est probablement le plus simple, surtout pour être compatible avec plusieurs navigateurs sans avoir à savoir ce que cela nécessite.
Alexis Wilke

1
Je reçois toujours un tableau vide! J'essaye de saisir un SVG par son attribut d, et j'essaye $ ("[d = chemin]"); où «chemin» est une variable contenant l'attribut d spécifique dont j'ai besoin. Quelqu'un at-il essayé de le faire avec des chemins svg?
tx291

438

Les navigateurs modernes prennent en charge natif querySelectorAllafin que vous puissiez faire:

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

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

Détails sur la compatibilité du navigateur:

Vous pouvez utiliser jQuery pour prendre en charge les navigateurs obsolètes (IE9 et versions antérieures):

$('[data-foo="value"]');

2
afin de concrétiser la définition "moderne": caniuse.com/#search=querySelectorAll
serhio

Il semble que la valeur ne puisse pas être un nombre ouSyntaxError: An invalid or illegal string was specified
jeum

3
Le sélecteur doit être:'[data-foo="value"]'
Yotam Omer

1
Des notes sur la perfomance? Est-ce plus rapide que d'itérer sur tous les nœuds?
Stepan Yakovenko

1
Qu'est-ce que "data-foo" ... et où est passé "myAttribute" dans cet exemple?
oo_dev

38

Nous pouvons utiliser le sélecteur d'attributs dans DOM en utilisant les méthodes document.querySelector()et document.querySelectorAll().

pour le vôtre:

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

et en utilisant querySlectorAll():

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

Dans querySelector()et les querySelectorAll()méthodes, nous pouvons sélectionner des objets comme nous le sélectionnons dans "CSS".

En savoir plus sur les sélecteurs d'attributs "CSS" dans https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors


J'ai dû supprimer les guillemets intérieurs comme ce document.querySelectorAll ("selector [myAttribute = aValue]");
Matjaz Hirsman

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

ps si vous connaissez le type d'élément exact, vous ajoutez le 3ème paramètre (ie div, a, p ...etc...):

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

mais au début, définissez cette fonction:

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 mis à jour par les recommandations des commentaires.


6
Pourquoi ?! Vous bouclez tous vos DOM en faisant cela
Arthur

3
Cela semble génial - si vous n'avez que 5 éléments sur la page.
sheriffderek

2
document.querySelectorAll('[data-foo="value"]');tel que proposé par @Wojtek Kruszewski sur awnser accepté.
Arthur

7

Voici un exemple, Comment rechercher des images dans un document par attribut src:

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


0

Utilisez des sélecteurs de requête, des exemples:

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

input[name]Entrer des éléments avec une namepropriété.

[id|=view]Éléments dont l'id commence par view-.

[class~=button]Éléments avec la buttonclasse.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.