Des expressions comme Element.getAttribute("id")
et Element.id
renvoient la même chose.
Lequel devrait être utilisé lorsque nous avons besoin des attributs d'un objet HTMLElement?
Existe-t-il un problème interserveur avec ces méthodes telles que getAttribute()
et setAttribute()
?
Ou tout impact sur les performances entre l'accès direct aux propriétés d'objet et l'utilisation de ces méthodes d'attribut?
getAttribute
récupère le attribut d'un élément DOM, alors que el.id
récupère le property de cet élément DOM. Ils ne sont pas les mêmes.
La plupart du temps, les propriétés DOM sont synchronisées avec des attributs.
Cependant, la synchronisation ne garantit pas la même valeur. Un exemple classique est entre el.href
et el.getAttribute('href')
pour un élément d'ancrage.
Par exemple:
<a href="/" id="hey"></a>
<script>
var a = document.getElementById('hey')
a.getAttribute('href') // "/"
a.href // Full URL except for IE that keeps '/'
</script>
Ce problème se produit car, selon le W3C , la propriété href doit être un lien bien formé. La plupart des navigateurs respectent cette norme (devinez qui ne le fait pas?).
Il existe un autre cas pour la propriété input
's checked
. La propriété DOM renvoie true
ou false
tandis que l'attribut renvoie la chaîne "checked"
ou une chaîne vide.
Et puis, il y a des propriétés qui sont synchronisées à sens unique seulement. Le meilleur exemple est la propriété value
d'un élément input
. Changer sa valeur via la propriété DOM ne changera pas l'attribut (edit: vérifiez le premier commentaire pour plus de précision).
Pour ces raisons, je vous suggérerais de continuer à utiliser le DOM properties, et non les attributs, car leur comportement diffère d'un navigateur à l'autre.
En réalité, vous ne devez utiliser les attributs que dans deux cas:
value
d'origine d'un élément input
).Si vous souhaitez une explication plus détaillée, je vous suggère fortement de lire cette page . Cela ne vous prendra que quelques minutes, mais vous serez ravis par les informations (que j'ai résumées ici).
getAttribute('attribute')
renvoie normalement la valeur de l'attribut sous forme de chaîne, exactement comme défini dans la source HTML de la page.
Cependant, element.attribute
peut renvoyer une valeur normalisée ou calculée de l'attribut. Exemples:
<a href="/foo"></a>
<input type="checkbox" checked>
<input type="checkbox" checked="bleh">
<img src='http://dummyimage.com/64x64/000/fff'>
<img src='http://dummyimage.com/64x64/000/fff' width="50%">
<img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
<div style='background: Lime;'></div>
.id
enregistre la surcharge de l'appel de fonction. (ce qui est très petit, mais vous avez demandé.)
Selon ce test jsPerfgetAttribute
est plus lent que la propriété id
.
PS
Curieusement, les deux instructions sont très mauvaises sur IE8 (comparé à d'autres navigateurs).
Utilisez toujours les propriétés sauf si vous avez une raison spécifique de ne pas le faire.
getAttribute()
et setAttribute()
sont rompus dans l'ancien IE (et le mode de compatibilité dans les versions ultérieures)Il y a quelques exceptions :
<form>
J'ai écrit à ce sujet à plusieurs reprises sur SO:
Essayez ci-dessous exemple pour comprendre cela complètement. Pour le DIV ci-dessous
<div class="myclass"></div>
La Element.getAttribute('class')
renverra myclass
mais vous devez utiliser Element.className
qui le récupère depuis la propriété DOM.
Un domaine dans lequel cela fait une grande différence est le style CSS basé sur les attributs.
Considérer ce qui suit:
const divs = document.querySelectorAll('div');
divs[1].custom = true;
divs[2].setAttribute('custom', true);
div {
border: 1px solid;
margin-bottom: 8px;
}
div[custom] {
background: #36a;
color: #fff;
}
<div>A normal div</div>
<div>A div with a custom property set directly.</div>
<div>A div with a custom attribute set with `setAttribute`</div>
La div avec la propriété personnalisée définie directement ne reflète pas la valeur de l'attribut et n'est pas sélectionnée par notre sélecteur d'attribut (div[custom]
) dans le fichier css.
La div avec l'attribut personnalisé défini à l'aide de setAttribute
peut toutefois être sélectionnée à l'aide d'un sélecteur d'attribut css et stylée en conséquence.