Les expressions aiment Element.getAttribute("id")
et Element.id
renvoient la même chose.
Lequel faut-il utiliser lorsque nous avons besoin des attributs d'un objet HTMLElement?
Y a-t-il un problème entre les navigateurs avec ces méthodes telles que getAttribute()
et setAttribute()
?
Ou un impact sur les performances entre l'accès direct aux propriétés des objets et l'utilisation de ces méthodes d'attributs?
Réponses:
getAttribute
récupère l' attribut d'un élément DOM, tandis queel.id
récupère la propriété 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 les attributs.
Cependant, la synchronisation ne garantit pas la même valeur . Un exemple classique est entre
el.href
etel.getAttribute('href')
pour un élément d'ancrage.Par exemple:
Ce comportement 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 y a un autre cas pour le
input
de »checked
la propriété. La propriété DOM renvoietrue
oufalse
tandis que l'attribut renvoie la chaîne"checked"
ou une chaîne vide.Et puis, certaines propriétés ne sont synchronisées que dans un sens . Le meilleur exemple est la
value
propriété d'uninput
élément. Changer sa valeur via la propriété DOM ne changera pas l'attribut (modifier: vérifiez le premier commentaire pour plus de précision).Pour ces raisons, je vous suggère de continuer à utiliser les propriétés DOM , et non les attributs, car leur comportement diffère d'un navigateur à l'autre.
En réalité, il n'y a que deux cas où vous devez utiliser les attributs:
value
d'uninput
élément).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 ravi des informations (que j'ai résumées ici).
la source
value
propriété d'une entrée obtient sa valeur initiale de l'attribut mais n'y est pas du tout liée. L'value
attribut est à la place entièrement synchronisé avec ladefaultValue
propriété. De mêmechecked
etdefaultChecked
. Sauf dans l'ancien IE (<= 7 et modes de compatibilité plus tard), qui a casségetAttribute()
etsetAttribute()
.a.href
renvoie l'URL complète,a.getAttribute("href")
retourne l'attribut exactement comme defiend dans la source HTML.input.formAction
) ou une chaîne vide (par exemplea.download
), ce qui rend les choses ambiguës. La seule exception concerne les valeurs qui ne sont pas synchronisées dans les deux sens, telles quevalue
.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
pourrait renvoyer une valeur normalisée ou calculée de l'attribut. Exemples:<a href="https://stackoverflow.com/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>
la source
Selon ce test jsPerf
getAttribute
est plus lent que laid
propriété.PS
Curieusement, les deux instructions fonctionnent très mal sur IE8 (par rapport aux autres navigateurs).
la source
Utilisez toujours les propriétés sauf si vous avez une raison spécifique de ne pas le faire.
getAttribute()
etsetAttribute()
sont cassés dans les anciens IE (et en mode de compatibilité dans les versions ultérieures)Il y a quelques exceptions :
<form>
élémentsJ'ai écrit à ce sujet plusieurs fois sur SO:
la source
.id
enregistre la surcharge de l'appel de fonction. (ce qui est très petit, mais vous avez demandé.)la source
Essayez l'exemple ci-dessous pour comprendre cela complètement. Pour le DIV ci-dessous
<div class="myclass"></div>
Le
Element.getAttribute('class')
retourneramyclass
mais vous devez utiliserElement.className
ce qui le récupère dans la propriété DOM.la source
Un domaine où cela fait une grande différence est le style CSS basé sur les attributs.
Considérer ce qui suit:
Le 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é par notre sélecteur d'attribut (
div[custom]
) dans le css.Le div avec l'attribut personnalisé défini à l'aide
setAttribute
, cependant, peut être sélectionné à l'aide d'un sélecteur d'attribut css, et stylé en conséquence.la source