Une meilleure pratique d'utilisation setAttribute
de la .
notation d'attribut dot ( ) a-t-elle été développée?
Par exemple:
myObj.setAttribute("className", "nameOfClass");
myObj.setAttribute("id", "someID");
ou
myObj.className = "nameOfClass";
myObj.id = "someID";
javascript
attributes
setattribute
Francisc
la source
la source
.setAttribute()
à[key] = value
, tout a commencé comme par magie.Réponses:
Vous devez toujours utiliser le
.attribute
formulaire direct (mais voir le lien quirksmode ci-dessous) si vous voulez un accès programmatique en JavaScript. Il doit gérer correctement les différents types d'attributs (pensez "onload").Utilisez
getAttribute
/setAttribute
lorsque vous souhaitez traiter le DOM tel quel (par exemple, texte littéral uniquement). Différents navigateurs confondent les deux. Voir Modes Quirks: compatibilité (in) des attributs .la source
De Javascript: The Definitive Guide , il clarifie les choses. Il note que les objets HTMLElement d'un document HTML définissent des propriétés JS qui correspondent à tous les attributs HTML standard.
Il vous suffit donc d'utiliser
setAttribute
des attributs non standard.Exemple:
la source
node.frameborder
n'est PAS défini, vous devez donc obtenir getAttribute pour récupérer la valeur.frameBorder
directement, mais notez la capitalisation. Quelqu'un a pensé que c'était une bonne idée de camelCase les équivalents JavaScript des attributs HTML. Je n'ai pas réussi à trouver de spécification pour cela, mais le net semble être d'accord qu'il s'agit de 12 cas spécifiques (pour HTML 4 au moins). Voir par exemple le post suivant: drupal.org/node/1420706#comment-6423420usemap
attribut ne peut pas être défini à l'aide de la notation par points lors de la création dynamique de la carte pour une image. Cela nécessiteimg.setAttribute('usemap', "#MapName");
Votre réponse implique-t-elle queusemap
c'est donc "non standard"?Aucune des réponses précédentes n'est complète et la plupart contiennent des informations erronées.
Il existe trois façons d'accéder aux attributs d'un élément DOM en JavaScript. Les trois fonctionnent de manière fiable dans les navigateurs modernes tant que vous comprenez comment les utiliser.
1.
element.attributes
Les éléments ont des attributs de propriété qui retournent un NamedNodeMap en direct d' objets Attr . Les index de cette collection peuvent être différents selon les navigateurs. Ainsi, la commande n'est pas garantie.
NamedNodeMap
a des méthodes pour ajouter et supprimer des attributs (getNamedItem
etsetNamedItem
, respectivement).Notez que bien que XML soit explicitement sensible à la casse, la spécification DOM appelle à la normalisation des noms de chaîne , de sorte que les noms passés à
getNamedItem
ne respectent pas la casse.Exemple d'utilisation:
2.
element.getAttribute
&element.setAttribute
Ces méthodes existent directement sur le
Element
sans avoir besoin d'accéder àattributes
ses méthodes mais remplissent les mêmes fonctions.Encore une fois, notez que le nom de chaîne n'est pas sensible à la casse.
Exemple d'utilisation:
3. Propriétés sur l'objet DOM, telles que
element.id
De nombreux attributs sont accessibles à l'aide de propriétés pratiques sur l'objet DOM. Les attributs existants dépendent du type du nœud DOM, et non des attributs définis dans le HTML. Les propriétés sont définies quelque part dans la chaîne prototype de l'objet DOM en question. Les propriétés spécifiques définies dépendront du type d'élément auquel vous accédez. Par exemple,
className
etid
sont définis surElement
et existent sur tous les nœuds DOM qui sont des éléments (c'est-à-dire pas des nœuds de texte ou de commentaire). Maisvalue
est plus étroit. Il est défini surHTMLInputElement
et peut ne pas exister sur d'autres éléments.Notez que les propriétés JavaScript sont sensibles à la casse. Bien que la plupart des propriétés utilisent des minuscules, certaines sont camelCase. Vérifiez donc toujours les spécifications pour en être sûr.
Ce "graphique" capture une partie de la chaîne de prototype pour ces objets DOM. Ce n'est même pas près d'être terminé, mais il capture la structure globale.
Exemple d'utilisation:
Mise en garde: il s'agit d'une explication de la façon dont la spécification HTML définit et les navigateurs modernes gèrent les attributs. Je n'ai pas tenté de faire face aux limitations des anciens navigateurs brisés. Si vous devez prendre en charge d'anciens navigateurs, en plus de ces informations, vous devrez savoir ce qui est cassé dans ces navigateurs.
la source
J'ai trouvé un cas où il
setAttribute
est nécessaire de modifier les attributs ARIA, car il n'y a pas de propriétés correspondantes. Par exempleIl n'y a
x.arialabel
rien ou quelque chose comme ça, vous devez donc utiliser setAttribute.Edit: x ["aria-label"] ne fonctionne pas . Vous avez vraiment besoin de setAttribute.
la source
Ces réponses ne traitent pas vraiment de la grande confusion entre les propriétés et les attributs . En outre, selon le prototype Javascript, vous pouvez parfois utiliser la propriété d'un élément pour accéder à des attributs et parfois vous ne pouvez pas.
Tout d'abord, vous devez vous rappeler que an
HTMLElement
est un objet Javascript. Comme tous les objets, ils ont des propriétés. Bien sûr, vous pouvez créer une propriété appelée presque tout ce que vous voulez à l'intérieurHTMLElement
, mais cela n'a rien à voir avec le DOM (ce qui est sur la page). La notation par points (.
) est pour les propriétés . Maintenant, il y a des propriétés spéciales qui sont mappées aux attributs, et au moment de l'écriture, il n'y en a que 4 qui sont garantis (plus à ce sujet plus tard).Tous les
HTMLElement
s incluent une propriété appeléeattributes
.HTMLElement.attributes
est un objet vivantNamedNodeMap
qui se rapporte aux éléments du DOM. «Live» signifie que lorsque le nœud change dans le DOM, il change du côté JavaScript, et vice versa. Les attributs DOM, dans ce cas, sont les nœuds en question. ANode
possède une.nodeValue
propriété que vous pouvez modifier.NamedNodeMap
les objets ont une fonction appeléesetNamedItem
où vous pouvez changer le nœud entier. Vous pouvez également accéder directement au nœud par la clé. Par exemple, vous pouvez dire.attributes["dir"]
qui est le même que.attributes.getNamedItem('dir');
(Note latérale,NamedNodeMap
ne respecte pas la casse, vous pouvez donc également passer'DIR'
);Il y a une fonction similaire directement dans
HTMLElement
laquelle vous pouvez simplement appelersetAttribute
qui créera automatiquement un nœud s'il n'existe pas et définira lenodeValue
. Il existe également certains attributs auxquels vous pouvez accéder directement en tant que propriétésHTMLElement
via des propriétés spéciales , telles quedir
. Voici une cartographie approximative de ce à quoi il ressemble:Vous pouvez donc modifier les
dir
attributs de 6 façons:Vous pouvez mettre à jour toutes les propriétés avec des méthodes # 1-5, mais seulement
dir
,id
,lang
etclassName
avec la méthode # 6.Extensions de HTMLElement
HTMLElement
a ces 4 propriétés spéciales. Certains éléments sont des classes étendues deHTMLElement
propriétés encore plus mappées. Par exemple,HTMLAnchorElement
aHTMLAnchorElement.href
,HTMLAnchorElement.rel
etHTMLAnchorElement.target
. Mais attention , si vous définissez ces propriétés sur des éléments qui n'ont pas ces propriétés spéciales (comme sur aHTMLTableElement
), les attributs ne sont pas modifiés et ce sont juste des propriétés personnalisées normales. Pour mieux comprendre, voici un exemple de son héritage:Propriétés personnalisées
Maintenant, le gros avertissement: comme tous les objets Javascript , vous pouvez ajouter des propriétés personnalisées. Mais cela ne changera rien sur le DOM. Tu peux faire:
Mais c'est la même chose que
Cela signifie que l'ajout d'une propriété personnalisée ne sera pas lié à
.attributes[attr].nodeValue
.Performance
J'ai construit un cas de test jsperf pour montrer la différence: https://jsperf.com/set-attribute-comparison . Fondamentalement, dans l'ordre:
dir
,id
,className
).element.attributes.ATTRIBUTENAME.nodeValue =
element.attributes.getNamedItem(ATTRIBUTENAME).nodeValue = newValue
element.attributes.ATTRIBUTENAME = newNode
element.attributes.setNamedItem(ATTRIBUTENAME) = newNode
Conclusion (TL; DR)
Utilisez les correspondances de propriétés spéciales de
HTMLElement
:element.dir
,element.id
,element.className
ouelement.lang
.Si vous êtes sûr à 100% que l'élément est un étendu
HTMLElement
avec une propriété spéciale, utilisez ce mappage spécial. (Vous pouvez vérifier avecif (element instanceof HTMLAnchorElement)
).Si vous êtes sûr à 100% que l'attribut existe déjà, utilisez
element.attributes.ATTRIBUTENAME.nodeValue = newValue
.Sinon, utilisez
setAttribute()
.la source
classList
est garanti à 100%, mais ce n'est pas une propriété de chaîne, c'est unDOMTokenList
objet vivant . La définition.className
directe est plus rapide que la manipulationclassList
, mais vous écraseriez le tout..value
, vous modifiez la valeur interne de laHTMLInputElement
, qui se reflète ensuite sur les attributs. Ils ne doivent pas non plus l'êtrestring
..valueAsNumber
changera envalue
interne , et sastring
forme apparaîtra dans l'value
attribut. developer.mozilla.org/en-US/docs/Web/HTML/Attributes"Quand utiliser setAttribute vs .attribute = en JavaScript?"
Une règle générale consiste à utiliser
.attribute
et de vérifier si cela fonctionne sur le navigateur...Si cela fonctionne sur le navigateur, vous êtes prêt à partir.
..Si ce n'est pas le cas, utilisez
.setAttribute(attribute, value)
plutôt que.attribute
pour cet attribut.Rincer-répéter pour tous les attributs.
Eh bien, si vous êtes paresseux, vous pouvez simplement utiliser
.setAttribute
. Cela devrait fonctionner correctement sur la plupart des navigateurs. (Bien que les navigateurs qui le prennent en charge.attribute
puissent l'optimiser mieux que.setAttribute(attribute, value)
.)la source
Cela ressemble à un cas où il est préférable d'utiliser setAttribute:
Dev.Opera - JavaScript efficace
la source
posElem.style = newStyle
fonctionne pas dans tous les navigateurs (a fonctionné pour moi dans Firefox)? Est-ce uniquement pour des raisons de performances quisetAttribute
sont privilégiées, en évitant les repeints? Est-ceposElem.style.cssText = newStyle
plus perfomant alorsposElem.style = newStyle
?méthodes pour définir des attributs (par exemple classe) sur un élément: 1. el.className = string 2. el.setAttribute ('class', string) 3. el.attributes.setNamedItem (object) 4. el.setAttributeNode (node)
J'ai fait un test de référence simple ( ici )
et il semble que setAttributeNode soit environ 3 fois plus rapide que setAttribute.
donc si les performances sont un problème - utilisez "setAttributeNode"
la source
Plats à emporter intéressants à partir du script Google API concernant ceci:
Ils le font comme ceci:
Remarquez comment ils utilisent
setAttribute
pour "src" et "nonce", mais ensuite.async = ...
pour l'attribut "async".Je ne suis pas sûr à 100%, mais c'est probablement parce que "async" n'est pris en charge que sur les navigateurs qui prennent en charge l'
.attr =
attribution directe . Donc, cela n'a aucun sens d'essayersestAttribute("async")
parce que si le navigateur ne comprend pas.async=...
- il ne comprendra pas l'attribut "async".J'espère que c'est un aperçu utile de mon projet de recherche "Un-minify GAPI" en cours . Corrige moi si je me trompe.
la source