Tiene una práctica recomendada para usar en setAttribute
lugar del punto (.
notación de atributo )?
P.ej:
myObj.setAttribute("className", "nameOfClass");
myObj.setAttribute("id", "someID");
o
myObj.className = "nameOfClass";
myObj.id = "someID";
javascript
attributes
setattribute
Francisc
fuente
fuente
.setAttribute()
a[key] = value
, todo comenzó a funcionar mágicamente.Respuestas:
Siempre debes usar el directo
.attribute
forma (pero vea el enlace del modo peculiar a continuación) si desea acceso programático en JavaScript. Debe manejar los diferentes tipos de atributos (piense "onload") correctamente.Use
getAttribute
/setAttribute
cuando desee tratar con el DOM tal como está (por ejemplo, solo texto literal). Diferentes navegadores confunden a los dos. Ver modos peculiares: compatibilidad de atributo (in) .fuente
Desde Javascript: la guía definitiva , aclara las cosas. Señala que HTMLElement objetos de un documento HTML definen propiedades JS que corresponden a todos los atributos HTML estándar.
Por lo tanto, solo necesita usar
setAttribute
para atributos no estándar.Ejemplo:
fuente
node.frameborder
NO esté definido, por lo que debe obtenerAttribute para recuperar el valor.frameBorder
directamente, pero tenga en cuenta la capitalización. Alguien pensó que era una buena idea camelCase los equivalentes de JavaScript de los atributos HTML. No he logrado encontrar ninguna especificación para esto, pero la red parece estar de acuerdo en que se trata de 12 casos específicos (al menos para HTML 4). Consulte, por ejemplo, la siguiente publicación: drupal.org/node/1420706#comment-6423420usemap
atributo no se puede establecer utilizando la notación de puntos al crear el mapa dinámicamente para una imagen. Requiereimg.setAttribute('usemap', "#MapName");
¿Su respuesta implica que,usemap
por lo tanto, es "no estándar"?Ninguna de las respuestas anteriores está completa y la mayoría contiene información errónea.
Hay tres formas de acceder a los atributos de un elemento DOM en JavaScript. Los tres funcionan de manera confiable en los navegadores modernos siempre que comprenda cómo utilizarlos.
1)
element.attributes
Los elementos tienen atributos de propiedad que devuelve un NamedNodeMap de objetos Attr en vivo . Los índices de esta colección pueden ser diferentes entre los navegadores. Por lo tanto, el pedido no está garantizado.
NamedNodeMap
tiene métodos para agregar y eliminar atributos (getNamedItem
ysetNamedItem
, respectivamente).Tenga en cuenta que aunque XML explícitamente distingue entre mayúsculas y minúsculas, la especificación DOM requiere que los nombres de cadena se normalicen , por lo que los nombres pasados no
getNamedItem
distinguen entre mayúsculas y minúsculas.Ejemplo de uso:
2.
element.getAttribute
&element.setAttribute
Estos métodos existen directamente en el
Element
sin necesidad de accederattributes
y sus métodos, pero realizan las mismas funciones.Nuevamente, observe que el nombre de la cadena no distingue entre mayúsculas y minúsculas.
Ejemplo de uso:
3. Propiedades en el objeto DOM, como
element.id
Se puede acceder a muchos atributos utilizando propiedades convenientes en el objeto DOM. Los atributos que existen dependen del tipo de nodo DOM, no de qué atributos están definidos en el HTML. Las propiedades se definen en algún lugar de la cadena de prototipos del objeto DOM en cuestión. Las propiedades específicas definidas dependerán del tipo de elemento al que esté accediendo. Por ejemplo,
className
yid
se definenElement
y existen en todos los nodos DOM que son elementos (es decir, no nodos de texto o comentario). Perovalue
es más estrecho. Está definidoHTMLInputElement
y puede no existir en otros elementos.Tenga en cuenta que las propiedades de JavaScript distinguen entre mayúsculas y minúsculas. Aunque la mayoría de las propiedades usarán minúsculas, algunas son camelCase. Así que siempre verifique las especificaciones para estar seguro.
Este "gráfico" captura una parte de la cadena de prototipo para estos objetos DOM. Ni siquiera está cerca de completarse, pero captura la estructura general.
Ejemplo de uso:
Advertencia: esta es una explicación de cómo las especificaciones HTML definen y los navegadores modernos manejan los atributos. No intenté lidiar con las limitaciones de los antiguos navegadores rotos. Si necesita admitir navegadores antiguos, además de esta información, necesitará saber qué está roto en esos navegadores.
fuente
Un caso que encontré donde
setAttribute
es necesario es al cambiar los atributos ARIA, ya que no hay propiedades correspondientes. Por ejemploNo hay
x.arialabel
nada ni nada por el estilo, por lo que debe usar setAttribute.Editar: x ["etiqueta aria"] no funciona . Realmente necesitas setAttribute.
fuente
Estas respuestas no abordan realmente la gran confusión entre las propiedades y los atributos . Además, dependiendo del prototipo de Javascript, a veces puedes usar la propiedad de un elemento para acceder a los atributos y otras veces no.
Primero, debe recordar que an
HTMLElement
es un objeto Javascript. Como todos los objetos, tienen propiedades. Claro, puede crear una propiedad llamada casi cualquier cosa que desee dentroHTMLElement
, pero no tiene que hacer nada con el DOM (lo que está en la página). La notación de puntos (.
) es para propiedades . Ahora, hay algunas propiedades especiales . que se asignan a los atributos, y en el momento de la escritura solo hay 4 que están garantizadas (más sobre eso más adelante).Todos los
HTMLElement
s incluyen una propiedad llamadaattributes
.HTMLElement.attributes
es un objeto vivoNamedNodeMap
que se relaciona con los elementos en el DOM. "En vivo" significa que cuando el nodo cambia en el DOM, cambian en el lado de JavaScript, y viceversa. Los atributos DOM, en este caso, son los nodos en cuestión. ANode
tiene una.nodeValue
propiedad que puede cambiar.NamedNodeMap
Los objetos tienen una función llamadasetNamedItem
donde puede cambiar todo el nodo. También puede acceder directamente al nodo con la tecla. Por ejemplo, puede decir.attributes["dir"]
cuál es el mismo que.attributes.getNamedItem('dir');
(NotaNamedNodeMap
al margen, no distingue entre mayúsculas y minúsculas, por lo que también puede pasar'DIR'
);Hay una función similar directamente en
HTMLElement
donde puede llamar,setAttribute
que creará automáticamente un nodo si no existe y establecerá elnodeValue
. También hay algunos atributos a los que puede acceder directamente como propiedades aHTMLElement
través de propiedades especiales , comodir
. Aquí hay un mapeo aproximado de cómo se ve:Para que pueda cambiar los
dir
atributos de 6 maneras:Puede actualizar todas las propiedades con métodos # 1-5, pero sólo
dir
,id
,lang
, yclassName
con el método # 6.Extensiones de HTMLElement
HTMLElement
tiene esas 4 propiedades especiales. Algunos elementos son clases extendidas oHTMLElement
tienen incluso más propiedades mapeadas. Por ejemplo,HTMLAnchorElement
tieneHTMLAnchorElement.href
,HTMLAnchorElement.rel
, yHTMLAnchorElement.target
. Pero tenga cuidado , si establece esas propiedades en elementos que no tienen esas propiedades especiales (como en aHTMLTableElement
), entonces los atributos no se cambian y son solo propiedades personalizadas normales. Para comprender mejor, aquí hay un ejemplo de su herencia:Propiedades personalizadas
Ahora la gran advertencia: al igual que todos los objetos Javascript , puede agregar propiedades personalizadas. Pero, esos no cambiarán nada en el DOM. Tu puedes hacer:
Pero eso es lo mismo que
Esto significa que no se vinculará la
.attributes[attr].nodeValue
adición de una propiedad personalizada .Actuación
He creado un caso de prueba jsperf para mostrar la diferencia: https://jsperf.com/set-attribute-comparison . Básicamente, en orden:
dir
,id
,className
).element.attributes.ATTRIBUTENAME.nodeValue =
element.attributes.getNamedItem(ATTRIBUTENAME).nodeValue = newValue
element.attributes.ATTRIBUTENAME = newNode
element.attributes.setNamedItem(ATTRIBUTENAME) = newNode
Conclusión (TL; DR)
Utilizar las asignaciones de propiedades especiales de
HTMLElement
:element.dir
,element.id
,element.className
, oelement.lang
.Si está 100% seguro de que el elemento es extendido
HTMLElement
con una propiedad especial, use esa asignación especial. (Puedes consultar conif (element instanceof HTMLAnchorElement)
).Si está 100% seguro de que el atributo ya existe, use
element.attributes.ATTRIBUTENAME.nodeValue = newValue
.Si no, úsalo
setAttribute()
.fuente
classList
está 100% garantizado de existir, pero no es una propiedad de cadena, es unDOMTokenList
objeto vivo . Establecer.className
directamente es más rápido que manipularclassList
, pero sobrescribiría todo..value
, está cambiando el valor interno deHTMLInputElement
, que luego se refleja en los atributos. Tampoco tienen que serlostring
..valueAsNumber
cambiarávalue
internamente , y sustring
forma aparecerá en elvalue
atributo. developer.mozilla.org/en-US/docs/Web/HTML/Attributes"¿Cuándo usar setAttribute vs .attribute = en JavaScript?"
Una regla general es usar
.attribute
y verificar si funciona en el navegador... Si funciona en el navegador, ya está listo.
Si no es así, use en
.setAttribute(attribute, value)
lugar de.attribute
para ese atributo.Enjuague y repita para todos los atributos.
Bueno, si eres flojo, simplemente puedes usarlo
.setAttribute
. Eso debería funcionar bien en la mayoría de los navegadores. (Aunque los navegadores que admiten.attribute
pueden optimizarlo mejor que.setAttribute(attribute, value)
).fuente
Este parece un caso en el que es mejor usar setAttribute:
Dev.Opera - JavaScript eficiente
fuente
posElem.style = newStyle
No funciona en todos los navegadores (funcionó para mí en Firefox)? ¿Es solo por razones de rendimiento lo quesetAttribute
se prefiere, evitando las repintado? ¿EsposElem.style.cssText = newStyle
más perfumante entoncesposElem.style = newStyle
?métodos para establecer atributos (por ejemplo, clase) en un elemento: 1. el.className = string 2. el.setAttribute ('class', string) 3. el.attributes.setNamedItem (objeto) 4. el.setAttributeNode (nodo)
Hice una prueba de referencia simple ( aquí )
y parece que setAttributeNode es aproximadamente 3 veces más rápido que usar setAttribute.
así que si el rendimiento es un problema, use "setAttributeNode"
fuente
Interesante extracción de la secuencia de comandos API de Google con respecto a esto:
Lo hacen así:
Observe cómo se usan
setAttribute
para "src" y "nonce", pero luego.async = ...
para el atributo "async".No estoy 100% seguro, pero probablemente se deba a que "async" solo es compatible con los navegadores que admiten la
.attr =
asignación directa . Entonces, no tiene sentido tratar desestAttribute("async")
porque si el navegador no comprende.async=...
, no entenderá el atributo "asíncrono".Con suerte, esa es una idea útil de mi proyecto de investigación en curso "Un-minify GAPI" . Corrígeme si me equivoco.
fuente