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");
Michael
la source
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 .

Nick Craver
la source
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"]');
Wojtek Kruszewski
la source
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

Naveen Pantra
la source
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.

T.Todua
la source
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']");
KhaledDev
la source
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.

Daniel De León
la source