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 (
typeyvalue).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
attributespropiedad 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,typeyvaluepropiedades (entre otros):La
idpropiedad es una propiedad reflejada para elidatributo: obtener la propiedad lee el valor del atributo y establecer la propiedad escribe el valor del atributo.ides una propiedad puramente reflejada, no modifica ni limita el valor.La
typepropiedad es una propiedad reflejada para eltypeatributo: obtener la propiedad lee el valor del atributo y establecer la propiedad escribe el valor del atributo.typeno 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.typete da"text".Por el contrario, la
valuepropiedad no refleja elvalueatributo. En cambio, es el valor actual de la entrada. Cuando el usuario cambia manualmente el valor del cuadro de entrada, lavaluepropiedad reflejará este cambio. Entonces, si el usuario ingresa"John"en el cuadro de entrada, entonces:mientras:
La
valuepropiedad refleja el contenido de texto actual dentro del cuadro de entrada, mientras que elvalueatributo contiene el contenido de texto inicial delvalueatributo 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
defaultValuepropiedad, que es un puro reflejo delvalueatributo:Hay varias propiedades que reflejan directamente su atributo (
rel,id), algunos son reflejos directos con ligeramente diferentes nombres (htmlForrefleja elforatributo,classNamerefleja elclassatributo), 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
colspanatributo tiene lacolSpanpropiedad ... 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
checkedatributo está representado por ladefaultCheckedpropiedad (del mismo modo para una entrada de texto, elvalueatributo está representado por ladefaultValuepropiedad). Secheckedrequiere 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 comoidno 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):
classes una palabra clave reservada en JS). Pero en realidad 2 propiedades,classListyclassName.fuente