95 votes

getAttribute() par rapport aux propriétés des objets élémentaires ?

Des expressions comme Element.getAttribute("id") y Element.id renvoient la même chose.

Lequel doit être utilisé lorsque nous avons besoin des attributs d'un objet HTMLElement ?

Ces méthodes posent-elles des problèmes de compatibilité entre navigateurs ? getAttribute() y setAttribute() ?

Y a-t-il un impact sur les performances entre l'accès direct aux propriétés de l'objet et l'utilisation de ces méthodes d'attributs ?

1 votes

Question similaire : Propriétés et attributs en HTML

132voto

Florian Margaine Points 16927

getAttribute récupère le attribut d'un élément DOM, tandis que el.id récupère le propriété de cet élément DOM. Ils ne sont pas identiques.

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 celui des relations entre el.href y el.getAttribute('href') pour un élément d'ancrage.

Par exemple :

<a href="http://stackoverflow.com/" id="hey"></a>
<script>
var a = document.getElementById('hey')
a.getAttribute('href') // "/"
a.href // Full URL except for IE that keeps '/'
</script>

Ce comportement se produit parce que, selon le W3C la propriété href doit être un lien bien formé. La plupart des navigateurs respectent cette norme (devinez qui ne la respecte pas ?).

Il y a un autre cas pour le input 's checked propriété. La propriété DOM renvoie true o false tandis que l'attribut renvoie la chaîne de caractères "checked" ou une chaîne vide.

Et puis, il y a certaines propriétés qui sont synchronisées unidirectionnel seulement . Le meilleur exemple est le value d'un input élément. Changer sa valeur via la propriété DOM ne changera pas l'attribut (edit : vérifier le premier commentaire pour plus de précision).

Pour ces raisons, je vous suggère de continuer à utiliser le DOM propriétés 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 :

  1. Un attribut HTML personnalisé, car il n'est pas synchronisé avec une propriété DOM.
  2. Pour accéder à un attribut HTML intégré, qui n'est pas synchronisé à partir de la propriété, et que vous êtes sûr d'avoir besoin de l'attribut (par exemple, l'attribut original value d'un input élément).

Si vous voulez une explication plus détaillée, je vous conseille vivement de lire cette page . Cela ne vous prendra que quelques minutes, mais vous serez enchanté par les informations (que j'ai résumées ici).

9 votes

+1 pour les bons conseils en général. Le truc de la synchronisation est légèrement décalé cependant : la fonction value d'une entrée obtient sa valeur initiale à partir de l'attribut, mais n'est pas liée à celui-ci. Le site value est au contraire entièrement synchronisé avec l'attribut defaultValue propriété. De même, checked y defaultChecked . Sauf dans l'ancien IE (<=7 et les modes de compatibilité ultérieurs), qui a cassé getAttribute() y setAttribute() .

0 votes

J'ai ajouté votre commentaire comme "explication supplémentaire" :-)

2 votes

Je pense que vous vous trompez dans le premier exemple. a.href renvoie l'URL complète, a.getAttribute("href") renvoie l'attribut exactement tel qu'il est défini dans la source HTML.

12voto

Salman A Points 60620

getAttribute('attribute') renvoie normalement la valeur de l'attribut sous la forme d'une chaîne, exactement telle qu'elle est définie dans la source HTML de la page.

Cependant, element.attribute pourrait retourner une valeur normalisée ou calculée de l'attribut. Exemples :

  • <a href="http://stackoverflow.com/foo"></a>
    • a.href contiendra complet URL
  • <input type="checkbox" checked>
    • input.checked sera true (booléen)
  • <input type="checkbox" checked="bleh">
    • input.checked sera true (booléen)
  • <img src='http://dummyimage.com/64x64/000/fff'>
    • img.width sera 0 (nombre) avant que l'image ne soit chargée
    • img.width sera de 64 (nombre) lorsque l'image (ou les premiers octets de celle-ci) sera chargée.
  • <img src='http://dummyimage.com/64x64/000/fff' width="50%">
    • img.width sera la calculé 50%
  • <img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
    • img.width sera 50 (nombre)
  • <div style='background: lime;'></div>
    • div.style sera un objet

3voto

gdoron Points 61066

.id économise les frais d'appel de fonction. (qui est très faible, mais vous avez demandé. )

0 votes

Bonjour gdoron, juste pour le plaisir de la curiosité : J'ai essayé de trouver une explication "officielle" à ce sujet (au-delà du test empirique, qui est assez clair ;) ) mais sans succès. Avez-vous un lien à ce sujet ?

3voto

mamoo Points 6151

Selon ce test jsPerf getAttribute est plus lent que id propriété.

PS

Curieusement, les deux déclarations fonctionnent très mal sur IE8 (par rapport aux autres navigateurs).

3voto

Tim Down Points 124501

Utilisez toujours les propriétés, sauf si vous avez une raison spécifique de ne pas le faire.

  • getAttribute() y setAttribute() ne fonctionnent pas dans les anciennes versions d'IE (et en mode de compatibilité dans les versions ultérieures).
  • sont plus pratiques (en particulier, celles qui correspondent à des attributs booléens).

Il y a quelques exceptions :

  • accéder aux attributs de <form> éléments
  • l'accès aux attributs personnalisés (bien que je déconseille l'utilisation des attributs personnalisés)

J'ai écrit sur ce sujet à plusieurs reprises sur SO :

0 votes

Avant IE 8, les propriétés et attributs ont été traités de manière identique . Comme vous y avez fait allusion précédemment, les propriétés sont la solution.

0 votes

MattMcDonald : Oui, c'est à cette rupture que je faisais allusion. Je ne me suis pas étendu sur le sujet dans cette réponse parce que je pensais l'avoir fait suffisamment dans d'autres réponses auxquelles j'ai fait référence :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X