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?

260
demandé sur Bergi 2011-05-14 22:04:41

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'attribut type : 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"> , alors theInput.getAttribute("type") vous donne "foo" mais theInput.type vous donne "text" .

  • en revanche, la propriété value ne reflète pas l'attribut value . 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'attribut value 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'attribut value :

    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.

596
répondu Šime Vidas 2018-04-27 23:01:51

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.

31
répondu sibidiba 2011-06-16 20:03:28

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=)

8
répondu Daniel Ruf 2014-11-07 17:47:13