Je pense que Tim l'a très bien dit , mais revenons en arrière:
Un élément DOM est un objet, une chose en mémoire. Comme la plupart des objets dans la POO, il a des propriétés . Il a également, séparément, une carte des attributs définis sur l'élément (provenant généralement du balisage que le navigateur a lu pour créer l'élément). Certaines propriétés de l'élément tirent leurs valeurs initiales d' attributs portant des noms identiques ou similaires ( value
obtient sa valeur initiale de l'attribut "value"; href
obtient sa valeur initiale de l'attribut "href", mais ce n'est pas exactement la même valeur; className
de la attribut "classe"). D'autres propriétés obtiennent leurs valeurs initiales de différentes manières: Par exemple, la parentNode
propriété obtient sa valeur en fonction de son élément parent;style
, qu'elle ait ou non un attribut "style".
Considérons cette ancre dans une page à http://example.com/testing.html
:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
De l'art ASCII gratuit (et en laissant de côté beaucoup de choses):
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| HTMLAnchorElement |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| href: "http://example.com/foo.html" |
| nom: "fooAnchor" |
| id: "fooAnchor" |
| className: "test one" |
| attributs: |
| href: "foo.html" |
| nom: "fooAnchor" |
| id: "fooAnchor" |
| classe: "test one" |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
Notez que les propriétés et les attributs sont distincts.
Maintenant, bien qu'ils soient distincts, parce que tout cela a évolué plutôt que d'être conçu à partir de zéro, un certain nombre de propriétés réécrivent l'attribut dont elles dérivent si vous les définissez. Mais tous ne le font pas, et comme vous pouvez le voir href
ci-dessus, le mappage n'est pas toujours une simple "transmission de la valeur", parfois une interprétation est impliquée.
Quand je parle de propriétés étant des propriétés d'un objet, je ne parle pas dans l'abstrait. Voici du code non jQuery:
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(Ces valeurs sont celles de la plupart des navigateurs; il existe certaines variations.)
L' link
objet est une chose réelle, et vous pouvez voir qu'il y a une réelle distinction entre accéder à une propriété et accéder à un attribut .
Comme l'a dit Tim, la grande majorité du temps, nous voulons travailler avec des propriétés. C'est en partie parce que leurs valeurs (même leurs noms) ont tendance à être plus cohérentes entre les navigateurs. La plupart du temps, nous ne voulons travailler avec des attributs que lorsqu'aucune propriété ne leur est associée (attributs personnalisés), ou lorsque nous savons que pour cet attribut particulier, l'attribut et la propriété ne sont pas 1: 1 (comme avec href
et "href" ci-dessus) .
Les propriétés standard sont présentées dans les différentes spécifications DOM:
Ces spécifications ont d'excellents index et je recommande de garder les liens à portée de main; Je les utilise tout le temps.
Les attributs personnalisés comprendraient, par exemple, tous les data-xyz
attributs que vous pourriez mettre sur des éléments pour fournir des métadonnées à votre code (maintenant que cela est valable en HTML5, tant que vous vous en tenez au data-
préfixe). (Les versions récentes de jQuery vous donnent accès aux data-xyz
éléments via la data
fonction, mais cette fonction n'est pas seulement un accesseur pour les data-xyz
attributs [elle fait à la fois plus et moins que cela]; sauf si vous avez réellement besoin de ses fonctionnalités, j'utiliserais la attr
fonction pour interagir avec data-xyz
attribut.)
La attr
fonction avait une logique compliquée pour obtenir ce qu'ils pensaient que vous vouliez, plutôt que d'obtenir littéralement l'attribut. Il a confondu les concepts. Déménager prop
et attr
était censé les déconfigurer. En bref dans v1.6.0 jQuery est allé trop loin à cet égard, mais la fonctionnalité a été rapidement ajouté à nouveau à attr
faire face aux situations communes où les gens utilisent attr
lorsque cela est techniquement , ils devraient utiliser prop
.