Expresiones como Element.getAttribute("id")
y Element.id
devuelven lo mismo.
¿Cuál debería usarse cuando necesitamos atributos de un objeto HTMLElement?
¿Hay algún problema entre navegadores con estos métodos como getAttribute()
y setAttribute()
?
¿O algún impacto en el rendimiento entre el acceso directo a las propiedades del objeto y el uso de estos métodos de atributos?
javascript
html
dom
PK
fuente
fuente
Respuestas:
getAttribute
recupera el atributo de un elemento DOM, mientrasel.id
recupera la propiedad de este elemento DOM. Ellos no son los mismos.La mayoría de las veces, las propiedades DOM se sincronizan con atributos.
Sin embargo, la sincronización no garantiza el mismo valor . Un ejemplo clásico es entre
el.href
yel.getAttribute('href')
para un elemento de anclaje.Por ejemplo:
Este comportamiento ocurre porque de acuerdo con el W3C , la propiedad href debe ser un enlace bien formado. La mayoría de los navegadores respetan este estándar (¿adivinen quién no?).
Hay otro caso para la
input
'schecked
propiedad. La propiedad DOM devuelvetrue
ofalse
mientras el atributo devuelve la cadena"checked"
o una cadena vacía.Y luego, hay algunas propiedades que se sincronizan en un solo sentido . El mejor ejemplo es la
value
propiedad de uninput
elemento. Cambiar su valor a través de la propiedad DOM no cambiará el atributo (editar: verifique el primer comentario para mayor precisión).Por estas razones, le sugiero que siga usando las propiedades DOM , y no los atributos, ya que su comportamiento difiere entre los navegadores.
En realidad, solo hay dos casos en los que necesita usar los atributos:
value
de uninput
elemento).Si desea una explicación más detallada, le sugiero que lea esta página . Le llevará solo unos minutos, pero estará encantado con la información (que resumí aquí).
fuente
value
de la sincronización está un poco apagado: la propiedad de una entrada obtiene su valor inicial del atributo, pero por lo demás no está vinculada a él en absoluto. En cambio, elvalue
atributo está completamente sincronizado con ladefaultValue
propiedad. Asimismochecked
ydefaultChecked
. Excepto en IE antiguo (<= 7 y modos de compatibilidad posteriores), que se ha rotogetAttribute()
ysetAttribute()
.a.href
devuelve la URL completa,a.getAttribute("href")
devuelve el atributo exactamente como defiend en la fuente HTML.input.formAction
. Ej. ) O una cadena vacía (pa.download
. Ej. ), Lo que hace que las cosas sean ambiguas. La única excepción son los valores que no están sincronizados en dos direcciones, comovalue
.getAttribute('attribute')
normalmente devuelve el valor del atributo como una cadena, exactamente como se define en el código fuente HTML de la página.Sin embargo,
element.attribute
podría devolver un valor normalizado o calculado del atributo. Ejemplos:<a href="https://stackoverflow.com/foo"></a>
<input type="checkbox" checked>
<input type="checkbox" checked="bleh">
<img src='http://dummyimage.com/64x64/000/fff'>
<img src='http://dummyimage.com/64x64/000/fff' width="50%">
<img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
<div style='background: lime;'></div>
fuente
De acuerdo con esta prueba jsPerf
getAttribute
es más lenta que laid
propiedad.PD
Curiosamente, ambas declaraciones funcionan muy mal en IE8 (en comparación con otros navegadores).
fuente
Utilice siempre las propiedades a menos que tenga una razón específica para no hacerlo.
getAttribute()
ysetAttribute()
están rotos en IE más antiguos (y en modo de compatibilidad en versiones posteriores)Hay algunas excepciones :
<form>
elementosHe escrito sobre este tema varias veces en SO:
fuente
.id
guarda la sobrecarga de la llamada a la función. (que es muy pequeño, pero preguntaste).fuente
Pruebe el siguiente ejemplo para comprender esto completamente. Para el DIV a continuación
<div class="myclass"></div>
El
Element.getAttribute('class')
volverá,myclass
pero debe usar elElement.className
que lo recupera de la propiedad DOM.fuente
Un área donde esto marca una gran diferencia es con el estilo CSS basado en atributos.
Considera lo siguiente:
El div con la propiedad personalizada establecida directamente no refleja el valor del atributo y no es seleccionado por nuestro selector de atributos (
div[custom]
) en el CSS.setAttribute
Sin embargo, el div con el atributo personalizado establecido usando se puede seleccionar usando un selector de atributo css y diseñarlo en consecuencia.fuente