J'ai une page XHTML où chaque élément HTML a un attribut personnalisé unique, comme ceci:
<div class="logo" tokenid="14"></div>
J'ai besoin d'un moyen de trouver cet élément par ID, similaire à document.getElementById()
, mais au lieu d'utiliser un ID général, je veux rechercher l'élément en utilisant mon attribut "tokenid"
Personnalisé. Quelque chose comme ça:
document.getElementByTokenId('14');
Est-ce possible? Si oui - tout indice serait grandement apprécié.
Merci.
Il n'est pas bon d'utiliser des attributs personnalisés dans le HTML. Le cas échéant, vous devez utiliser les attributs data
de HTML5 .
Néanmoins, vous pouvez écrire votre propre fonction qui parcourt l'arborescence, mais ce sera assez lent par rapport à getElementById
car vous ne pouvez pas utiliser tout indice:
function getElementByAttribute(attr, value, root) {
root = root || document.body;
if(root.hasAttribute(attr) && root.getAttribute(attr) == value) {
return root;
}
var children = root.children,
element;
for(var i = children.length; i--; ) {
element = getElementByAttribute(attr, value, children[i]);
if(element) {
return element;
}
}
return null;
}
Dans le pire des cas, cela traversera tout l'arbre. Réfléchissez à la façon de changer votre concept afin de pouvoir utiliser autant que possible les fonctions du navigateur.
Dans les navigateurs plus récents, vous utilisez la méthode querySelector
, où elle serait simplement:
var element = document.querySelector('[tokenid="14"]');
Ce sera aussi beaucoup plus rapide.
Mise à jour: Veuillez noter le commentaire de @Andy E ci-dessous. Il se peut que vous rencontriez des problèmes avec IE (comme toujours;)). Si vous effectuez beaucoup de récupération d'éléments de ce type, vous devriez vraiment envisager d'utiliser une bibliothèque JavaScript telle que jQuery, comme les autres mentionnées. Il cache toutes ces différences de navigateur.
<div data-automation="something">
</div>
document.querySelector("div[data-automation]")
=> trouve le div
document.querySelector("div[data-automation='something']")
=> trouve le div avec une valeur
Si vous utilisez jQuery, vous pouvez utiliser une partie de leur magie de sélection pour faire quelque chose comme ceci:
$('div[tokenid=14]')
comme votre sélecteur.
Si vous êtes prêt à utiliser JQuery , alors:
var myElement = $('div[tokenid="14"]').get();
Utilisez cette fonction plus stable:
function getElementsByAttribute(attr, value) {
var match = [];
/* Get the droids we are looking for*/
var elements = document.getElementsByTagName("*");
/* Loop through all elements */
for (var ii = 0, ln = elements.length; ii < ln; ii++) {
if (elements[ii].nodeType === 1){
if (elements[ii].name != null){
/* If a value was passed, make sure it matches the elements */
if (value) {
if (elements[ii].getAttribute(attr) === value)
match.Push(elements[ii]);
} else {
/* Else, simply Push it */
match.Push(elements[ii]);
}
}
}
}
return match;
};