Quelle est la différence entre les propriétés et les attributs en HTML?
après les modifications apportées dans jQuery 1.6.1, j'ai essayé de définir la différence entre les propriétés et les attributs en HTML.
en regardant la liste sur le jquery 1.6.1 notes de version (près du bas), il semble qu'on puisse classer les propriétés et attributs HTML comme suit:
-
propriétés: Toutes qui ont soit une valeur booléenne ou qui sont UA calculé tel que selectedIndex.
-
attributs: 'attributs' qui peuvent être ajoutés à un élément HTML qui n'est ni booléen ni contenant une valeur générée par UA.
pensées?
3 réponses
lorsque vous écrivez du code source HTML, vous pouvez définir attributs sur vos éléments HTML. Ensuite, une fois que le navigateur aura épluché votre code, un noeud DOM correspondant sera créé. Ce noeud est un objet, et donc il a propriétés .
par exemple, cet élément HTML:
<input type="text" value="Name:">
possède 2 attributs ( type
et value
).
une fois le navigateur parse ce code, un objet HTMLInputElement sera créé, et cet objet contiendra des douzaines de propriétés comme: accept, accessKey, align, alt, attributes, autofocus, baseURI, checked, childElementCount, childNodes, children, classList, className, clientHeight, etc.
pour un objet DOM node donné, les propriétés sont les propriétés de cet objet, et les attributs sont les éléments de la propriété attributes
de cet objet.
Lorsqu'un noeud DOM est créé pour un élément HTML donné, beaucoup de ses propriétés se rapportent à des attributs avec les mêmes noms ou des noms similaires, mais ce n'est pas une relation un-à-un. Par exemple, pour cet élément HTML:
<input id="the-input" type="text" value="Name:">
le noeud DOM correspondant aura id
, type
, et value
propriétés (entre autres):
-
le "bien 151980920" est un "bien reflété 1519420920" pour l'attribut
id
: obtenir la propriété lit la valeur de l'attribut, et définir la propriété écrit la valeur de l'attribut.id
est une pure propriété réfléchie, il ne modifie ni limite la valeur. -
la propriété
type
est une propriété réfléchie pour l'attributtype
: obtenir la propriété lit la valeur de l'attribut, et la définition de la propriété écrit la valeur de l'attribut.type
n'est pas une propriété réfléchie pure parce qu'elle est limitée à valeurs connues (par exemple, les types valides d'une entrée). Si vous avez<input type="foo">
, alorstheInput.getAttribute("type")
vous donne"foo"
maistheInput.type
vous donne"text"
. -
en revanche, la propriété
value
ne reflète pas l'attributvalue
. Au lieu de cela, c'est la valeur actuelle de entrée. Lorsque l'utilisateur modifie manuellement la valeur de la boîte de saisie, la propriétévalue
reflétera ce changement. Ainsi, si l'utilisateur entre"John"
dans la boîte de saisie, alors:theInput.value // returns "John"
attendu que:
theInput.getAttribute('value') // returns "Name:"
la propriété
value
reflète le texte courant contenu à l'intérieur de la case d'entrée, tandis que l'attributvalue
contient le texte initial contenu de la case d'entrée.value
attribut du code source HTML.donc si vous voulez savoir ce qui est actuellement dans la zone de texte, lisez la propriété. Toutefois, si vous voulez connaître la valeur initiale de la zone de texte, lisez l'attribut. Ou vous pouvez utiliser la propriété
defaultValue
, qui est un pur reflet de l'attributvalue
:theInput.value // returns "John" theInput.getAttribute('value') // returns "Name:" theInput.defaultValue // returns "Name:"
il existe plusieurs propriétés qui reflètent directement leur attribut ( rel
, id
), certaines sont des réflexions directes avec des noms légèrement différents ( htmlFor
reflète l'attribut for
, className
reflète l'attribut class
), beaucoup qui reflètent leur attribut mais avec des restrictions/modifications ( src
, href
, disabled
, multiple
), et ainsi de suite. le spec couvre les différents types de réflexion.
les réponses expliquent déjà comment les attributs et les propriétés sont traités différemment, mais je voudrais vraiment souligner à quel point insensé c'est. Même si c'est dans une certaine mesure le cas.
il est fou, d'avoir certains des attributs (par exemple id, class, foo, bar ) pour conserver un seul type de valeur dans le DOM, tandis que certains attributs (par exemple coché, sélectionné ) pour conserver deux valeurs; que est, la valeur "lorsqu'il a été chargé" et la valeur de la "dynamique de l'état". (Le DOM n'est-il pas censé représenter l'état du document dans toute sa portée?)
il est absolument essentiel que deux champs d'entrée , par exemple un texte et un case à cocher se comportent de la même manière . Si le champ text input ne conserve pas un " quand il a été chargé" valeur et la valeur" courant, dynamique", pourquoi la case à cocher? Si la case à cocher comporte deux valeurs pour l'attribut coché , pourquoi n'en a-t-elle pas deux pour ses attributs class et id ? Si vous vous attendez à changer la valeur d'un champ texte *input*, et que vous vous attendez à ce que le DOM (c'est-à-dire la "représentation sérialisée") change, et reflète ce changement, pourquoi diable ne vous attendriez pas à ce qu'il en soit de même d'une entrée champ de type case à cocher sur l'attribut coché?
La différenciation, de la "elle est un attribut booléen" n'a tout simplement aucun sens pour moi, ou, au moins pas une raison suffisante pour cela.
bien ceux-ci sont spécifiés par le w3c qu'est-ce qu'un attribut et qu'est-ce qu'une propriété http://www.w3.org/TR/SVGTiny12/attributeTable.html
mais actuellement attr et prop ne sont pas si différents et il ya presque la même
mais ils préfèrent prop pour certaines choses
Résumé de l'Usage Privilégié
The .prop() la méthode doit être utilisée pour les booléens attributs / propriétés et pour les propriétés qui n'existent pas en html (comme window.emplacement.) Tous les autres attributs (ceux que vous pouvez voir dans le html) peuvent et doivent continuer à être manipulés avec le .attr() la méthode.
Eh bien en fait, vous n'avez pas à changer quelque chose si vous utilisez attr ou prop ou les deux, les deux travaux mais j'ai vu dans ma propre application que prop fonctionnait là où atrr ne fonctionnait pas donc j'ai pris dans mon 1.6 app prop=)