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 des notes de publication de jQuery 1.6.1 (près du bas), il semble que l'on puisse classer les propriétés et attributs HTML comme suit:
Propriétés: tout ce qui a une valeur booléenne ou qui est calculé par UA 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?
javascript
html
dom
properties
schalkneethling
la source
la source
Réponses:
Lors de l'écriture de code source HTML, vous pouvez définir des attributs sur vos éléments HTML. Ensuite, une fois que le navigateur a analysé votre code, un nœud DOM correspondant sera créé. Ce nœud est un objet et a donc des propriétés .
Par exemple, cet élément HTML:
a 2 attributs (
type
etvalue
).Une fois que le navigateur a analysé ce code, un objet HTMLInputElement sera créé et cet objet contiendra des dizaines de propriétés telles que: accept, accessKey, align, alt, attributs, autofocus, baseURI, vérifié, childElementCount, childNodes, children, classList, className, clientHeight, etc.
Pour un objet de noeud DOM donné, les propriétés sont les propriétés de cet objet et les attributs sont les éléments de la
attributes
propriété de cet objet.Lorsqu'un nœud DOM est créé pour un élément HTML donné, bon nombre de ses propriétés se rapportent à des attributs portant des noms identiques ou similaires, mais ce n'est pas une relation un à un. Par exemple, pour cet élément HTML:
le noeud DOM correspondant aura
id
,type
et lesvalue
propriétés (entre autres):La
id
propriété est une propriété reflétée pour l'id
attribut: obtenir la propriété lit la valeur d'attribut et définir la propriété écrit la valeur d'attribut.id
est une propriété reflétée pure , elle ne modifie ni ne limite la valeur.La
type
propriété est une propriété reflétée pour l'type
attribut: obtenir la propriété lit la valeur d'attribut et définir la propriété écrit la valeur d'attribut.type
n'est pas une propriété reflétée pure car elle est limitée aux valeurs connues (par exemple, les types valides d'une entrée). Si vous l'aviez<input type="foo">
, alorstheInput.getAttribute("type")
vous donne"foo"
maistheInput.type
vous donne"text"
.En revanche, la
value
propriété ne reflète pas l'value
attribut. Il s'agit plutôt de la valeur actuelle de l'entrée. Lorsque l'utilisateur modifie manuellement la valeur de la zone de saisie, lavalue
propriété reflétera cette modification. Donc, si l'utilisateur entre"John"
dans la zone de saisie, alors:tandis que:
La
value
propriété reflète le contenu textuel actuel à l'intérieur de la zone de saisie, tandis que l'value
attribut contient le contenu textuel initial de l'value
attribut du code source HTML.Donc, si vous voulez savoir ce qui se trouve actuellement dans la zone de texte, lisez la propriété. Si vous voulez cependant savoir quelle était la valeur initiale de la zone de texte, lisez l'attribut. Ou vous pouvez utiliser la
defaultValue
propriété, qui est un pur reflet de l'value
attribut:Il y a plusieurs propriétés qui reflètent directement leur attribut (
rel
,id
), certains sont des réflexions directes avec des noms légèrement différents (htmlFor
reflète l'for
attribut,className
reflète l'class
attribut), beaucoup qui reflètent leur attribut , mais avec restrictions / modifications (src
,href
,disabled
,multiple
), etc. sur. La spécification couvre les différents types de réflexion.la source
for
->htmlFor
) et de même une liste de propriétés qui prennent leur valeur initiale d'un attribut, mais ne la reflètent pas (input.value
). Je m'attends à ce que ce soit quelque part dans la source d'une bibliothèque comme github.com/Matt-Esch/virtual-dom mais ce n'est pas vraiment documenté.Après avoir lu la réponse de Sime Vidas , j'ai cherché plus et trouvé une explication très simple et facile à comprendre dans les documents angulaires .
la source
colspan
attribut a lacolSpan
propriété. ... Alors, quel attribut n'a pas de propriété associée maintenant?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 c'est complètement fou . Même si c'est dans une certaine mesure la spécification.
Il est fou d'avoir certains attributs (par exemple id, class, foo, bar ) pour ne conserver qu'un seul type de valeur dans le DOM, tandis que certains attributs (par exemple coché, sélectionné ) pour conserver deux valeurs; c'est-à-dire la valeur "quand il a été chargé" et la valeur de "l'état dynamique". (Le DOM n'est-il pas censé représenter l'état du document dans sa totalité?)
Il est absolument essentiel que deux champs de saisie , par exemple un texte et une case à cocher, se comportent de la même manière . Si le champ de saisie de texte ne conserve pas une valeur distincte "quand il a été chargé" et la valeur "actuelle, dynamique", pourquoi la case à cocher? Si la case à cocher a deux valeurs pour l' attribut vérifié , pourquoi n'en a-t-il pas deux pour ses attributs class et id ? Si vous vous attendez à changer la valeur d'un champ de saisie de texte * 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-vous pas à la même chose à partir d'un champ de saisie de case à cocher type sur l'attribut vérifié?
La différenciation de "c'est un attribut booléen" n'a tout simplement aucun sens pour moi, ou n'est tout au moins pas une raison suffisante pour cela.
la source
checked
attribut est représenté par ladefaultChecked
propriété (de même pour une entrée de texte, l'value
attribut est représenté par ladefaultValue
propriété). Une deuxième propriétéchecked
,, est requise pour indiquer si la case à cocher est cochée car elle fait partie intrinsèque de la fonctionnalité d'une case à cocher: elle est interactive et peut être modifiée (et réinitialisée à la valeur par défaut, si un bouton de réinitialisation de formulaire est présent) par l'utilisateur , d'une manière quiid
n'est pas un autre attribut tel que n'est pas. Cela n'a rien à voir avec le fait qu'il s'agit d'un attribut booléen.bien ceux-ci sont spécifiés par le w3c ce qui est un attribut et ce qui est une propriété http://www.w3.org/TR/SVGTiny12/attributeTable.html
mais actuellement attr et prop ne sont pas si différents et il y a presque le même
mais ils préfèrent les accessoires pour certaines choses
Eh bien, en fait, vous n'avez pas à changer quelque chose si vous utilisez attr ou prop ou les deux, les deux fonctionnent mais j'ai vu dans ma propre application que prop fonctionnait là où atrr ne fonctionnait pas, alors j'ai pris mon prop 1.6 app =)
la source
Propriétés et attributs HTML de différence:
Examinons d'abord les définitions de ces mots avant d'évaluer la différence en HTML:
Définition anglaise:
Dans le contexte HTML:
Lorsque le navigateur analyse le HTML, il crée une structure de données arborescente qui est fondamentalement une représentation en mémoire du HTML. Si la structure de données de l'arborescence contient des nœuds qui sont des éléments HTML et du texte. Les attributs et les propriétés s'y rapportent de la manière suivante:
Il est également important de réaliser que le mappage de ces propriétés n'est pas de 1 à 1. En d'autres termes, tous les attributs que nous donnons sur un élément HTML n'auront pas une propriété DOM nommée similaire.
En outre, différents éléments DOM ont des propriétés différentes. Par exemple, un
<input>
élément a une propriété value qui n'est pas présente sur une<div>
propriété.Exemple:
Prenons le document HTML suivant:
Ensuite, nous inspectons le
<div>
, dans la console JS:Nous voyons les propriétés DOM suivantes (chrome devtools, pas toutes les propriétés affichées):
class
est un mot clé réservé dans JS). Mais en fait 2 propriétés,classList
etclassName
.la source