Después de los cambios realizados en jQuery 1.6.1, he estado tratando de definir la diferencia entre propiedades y atributos en HTML.
Mirando la lista en las notas de la versión jQuery 1.6.1 (cerca de la parte inferior), parece que uno puede clasificar las propiedades y atributos HTML de la siguiente manera:
Propiedades: todo lo que tiene un valor booleano o que es UA calculado, como selectedIndex.
Atributos: 'Atributos' que se pueden agregar a un elemento HTML que no es booleano ni contiene un valor generado por UA.
Pensamientos?
javascript
html
dom
properties
schalkneethling
fuente
fuente
Respuestas:
Al escribir código fuente HTML, puede definir atributos en sus elementos HTML. Luego, una vez que el navegador analiza su código, se creará un nodo DOM correspondiente. Este nodo es un objeto y, por lo tanto, tiene propiedades .
Por ejemplo, este elemento HTML:
tiene 2 atributos (
type
yvalue
).Una vez que el navegador analiza este código, se creará un objeto HTMLInputElement , y este objeto contendrá docenas de propiedades como: aceptar, accessKey, alinear, alt, atributos, enfoque automático, baseURI, marcado, childElementCount, childNodes, children, classList, className, altura del cliente, etc.
Para un objeto de nodo DOM dado, las propiedades son las propiedades de ese objeto y los atributos son los elementos de la
attributes
propiedad de ese objeto.Cuando se crea un nodo DOM para un elemento HTML dado, muchas de sus propiedades se relacionan con atributos con el mismo nombre o nombres similares, pero no es una relación uno a uno. Por ejemplo, para este elemento HTML:
el nodo DOM correspondiente tendrá
id
,type
yvalue
propiedades (entre otros):La
id
propiedad es una propiedad reflejada para elid
atributo: obtener la propiedad lee el valor del atributo y establecer la propiedad escribe el valor del atributo.id
es una propiedad puramente reflejada, no modifica ni limita el valor.La
type
propiedad es una propiedad reflejada para eltype
atributo: obtener la propiedad lee el valor del atributo y establecer la propiedad escribe el valor del atributo.type
no es una propiedad reflejada pura porque está limitada a valores conocidos (por ejemplo, los tipos válidos de una entrada). Si lo tuvieras<input type="foo">
, entoncestheInput.getAttribute("type")
te da"foo"
perotheInput.type
te da"text"
.Por el contrario, la
value
propiedad no refleja elvalue
atributo. En cambio, es el valor actual de la entrada. Cuando el usuario cambia manualmente el valor del cuadro de entrada, lavalue
propiedad reflejará este cambio. Entonces, si el usuario ingresa"John"
en el cuadro de entrada, entonces:mientras:
La
value
propiedad refleja el contenido de texto actual dentro del cuadro de entrada, mientras que elvalue
atributo contiene el contenido de texto inicial delvalue
atributo del código fuente HTML.Entonces, si desea saber qué hay actualmente dentro del cuadro de texto, lea la propiedad. Sin embargo, si desea saber cuál era el valor inicial del cuadro de texto, lea el atributo. O puede usar la
defaultValue
propiedad, que es un puro reflejo delvalue
atributo:Hay varias propiedades que reflejan directamente su atributo (
rel
,id
), algunos son reflejos directos con ligeramente diferentes nombres (htmlFor
refleja elfor
atributo,className
refleja elclass
atributo), muchos que reflejan su atributo pero con restricciones / modificaciones (src
,href
,disabled
,multiple
), etc. en. La especificación cubre los diversos tipos de reflexión.fuente
for
->htmlFor
) y, de manera similar, una lista de propiedades que toman su valor inicial de un atributo, pero no lo reflejan (input.value
). Espero que esto esté en algún lugar de la fuente de una biblioteca como github.com/Matt-Esch/virtual-dom pero no está realmente documentado.Después de leer la respuesta de Sime Vidas , busqué más y encontré una explicación muy directa y fácil de entender en los documentos angulares .
fuente
colspan
atributo tiene lacolSpan
propiedad ... Entonces, ¿qué atributo no tiene una propiedad relacionada ahora?Las respuestas ya explican cómo los atributos y las propiedades se manejan de manera diferente, pero realmente me gustaría señalar lo totalmente loco que es esto. Incluso si es hasta cierto punto la especificación.
Es una locura tener algunos de los atributos (por ejemplo , id, class, foo, bar ) para retener solo un tipo de valor en el DOM, mientras que algunos atributos (por ejemplo , marcado, seleccionado ) para retener dos valores; es decir, el valor "cuando se cargó" y el valor del "estado dinámico". (¿No se supone que el DOM debe representar el estado del documento en toda su extensión?)
Es absolutamente esencial que dos campos de entrada , por ejemplo, un texto y una casilla de verificación se comporten de la misma manera . Si el campo de entrada de texto no retiene un valor separado "cuando se cargó" y el valor "actual, dinámico", ¿por qué la casilla de verificación? Si la casilla de verificación tiene dos valores para el atributo marcado , ¿por qué no tiene dos para sus atributos de clase e id ? Si espera cambiar el valor de un campo de entrada de texto * y espera que el DOM (es decir, la "representación serializada") cambie y refleje este cambio, ¿por qué no esperaría lo mismo de un campo de entrada de tipo casilla de verificación en el atributo marcado?
La diferenciación de "es un atributo booleano" simplemente no tiene ningún sentido para mí, o al menos no es una razón suficiente para esto.
fuente
checked
atributo está representado por ladefaultChecked
propiedad (del mismo modo para una entrada de texto, elvalue
atributo está representado por ladefaultValue
propiedad). Sechecked
requiere una segunda propiedad, para representar si la casilla de verificación está marcada porque esta es una parte intrínseca de la funcionalidad de una casilla de verificación: es interactiva y el usuario puede cambiarla (y restablecerla al valor predeterminado, si está presente un botón de restablecimiento de formulario) , de una manera que otro atributo comoid
no es. No tiene nada que ver con el hecho de que es un atributo booleano.bueno, estos son especificados por el w3c qué es un atributo y qué es una propiedad http://www.w3.org/TR/SVGTiny12/attributeTable.html
pero actualmente attr y prop no son tan diferentes y hay casi lo mismo
pero prefieren accesorios para algunas cosas
bueno, en realidad no tienes que cambiar algo si usas attr o prop o ambos, ambos funcionan, pero vi en mi propia aplicación que el accesorio funcionaba donde atrr no funcionaba, así que tomé mi aplicación 1.6 prop =)
fuente
Diferencia de propiedades y atributos HTML:
Primero veamos las definiciones de estas palabras antes de evaluar cuál es la diferencia en HTML:
Definición en inglés:
En contexto HTML:
Cuando el navegador analiza el HTML, crea una estructura de datos de árbol que básicamente es una representación en memoria del HTML. La estructura de datos del árbol contiene nodos que son elementos HTML y texto. Los atributos y las propiedades se relacionan con esto de la siguiente manera:
También es importante darse cuenta de que la asignación de estas propiedades no es de 1 a 1. En otras palabras, no todos los atributos que le damos a un elemento HTML tendrán una propiedad DOM similar.
Además tienen diferentes elementos DOM diferentes propiedades. Por ejemplo, un
<input>
elemento tiene una propiedad de valor que no está presente en una<div>
propiedad.Ejemplo:
Tomemos el siguiente documento HTML:
Luego inspeccionamos
<div>
, en la consola JS:Vemos las siguientes propiedades DOM (devtools de Chrome, no se muestran todas las propiedades):
class
es una palabra clave reservada en JS). Pero en realidad 2 propiedades,classList
yclassName
.fuente