Entonces jQuery 1.6 tiene la nueva función prop()
.
$(selector).click(function(){
//instead of:
this.getAttribute('style');
//do i use:
$(this).prop('style');
//or:
$(this).attr('style');
})
o en este caso, ¿hacen lo mismo?
Y si no debe de cambiar a usar prop()
, todas las viejas attr()
llamadas se romperá si me cambio a 1.6?
ACTUALIZAR
selector = '#id'
$(selector).click(function() {
//instead of:
var getAtt = this.getAttribute('style');
//do i use:
var thisProp = $(this).prop('style');
//or:
var thisAttr = $(this).attr('style');
console.log(getAtt, thisProp, thisAttr);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<div id='id' style="color: red;background: orange;">test</div>
(vea también este violín: http://jsfiddle.net/maniator/JpUF2/ )
La consola registra el getAttribute
como una cadena y el attr
como una cadena, pero el prop
como un CSSStyleDeclaration
, ¿Por qué? ¿Y cómo afecta eso a mi codificación en el futuro?
Respuestas:
Actualización 1 de noviembre de 2012
Mi respuesta original se aplica específicamente a jQuery 1.6. Mi consejo sigue siendo el mismo, pero jQuery 1.6.1 cambió un poco las cosas: frente a la pila de sitios web dañados, el equipo de jQuery volvió
attr()
a algo cercano (pero no exactamente igual) a su antiguo comportamiento para los atributos booleanos . John Resig también escribió en su blog al respecto . Puedo ver la dificultad en la que estaban pero aún no estoy de acuerdo con su recomendación de preferirattr()
.Respuesta original
Si solo ha usado jQuery y no el DOM directamente, esto podría ser un cambio confuso, aunque definitivamente es una mejora conceptual. Sin embargo, no es tan bueno para los miles de millones de sitios que usan jQuery que se romperán como resultado de este cambio.
Resumiré los principales problemas:
prop()
más queattr()
.prop()
hace lo queattr()
solía hacer. Reemplazar llamadasattr()
conprop()
en su código generalmente funcionará.checked
propiedad es un booleano, lastyle
propiedad es un objeto con propiedades individuales para cada estilo, lasize
propiedad es un número.value
ychecked
: para estos atributos, la propiedad siempre representa el estado actual mientras que el El atributo (excepto en versiones anteriores de IE) corresponde al valor predeterminado / verificación de la entrada (reflejado en la propiedaddefaultValue
/defaultChecked
).Si usted es un desarrollador de jQuery y está confundido por todo este negocio acerca de las propiedades y los atributos, debe dar un paso atrás y aprender un poco al respecto, ya que jQuery ya no está tratando tan duro de protegerlo de estas cosas. Para la palabra autorizada pero algo seca sobre el tema, están las especificaciones: DOM4 , HTML DOM , DOM Nivel 2 , DOM Nivel 3 . La documentación DOM de Mozilla es válida para la mayoría de los navegadores modernos y es más fácil de leer que las especificaciones, por lo que puede encontrar útil su referencia DOM . Hay una sección sobre propiedades de elementos .
Como un ejemplo de cómo las propiedades son más fáciles de manejar que los atributos, considere una casilla de verificación que está marcada inicialmente. Aquí hay dos posibles piezas de HTML válido para hacer esto:
Entonces, ¿cómo saber si la casilla de verificación está marcada con jQuery? Mire en Stack Overflow y comúnmente encontrará las siguientes sugerencias:
if ( $("#cb").attr("checked") === true ) {...}
if ( $("#cb").attr("checked") == "checked" ) {...}
if ( $("#cb").is(":checked") ) {...}
En realidad, esto es lo más simple que se puede hacer en el mundo con la
checked
propiedad booleana, que ha existido y funcionó perfectamente en todos los principales navegadores programables desde 1995:if (document.getElementById("cb").checked) {...}
La propiedad también hace que marcar o desmarcar la casilla sea trivial:
document.getElementById("cb").checked = false
En jQuery 1.6, esto se convierte inequívocamente
$("#cb").prop("checked", false)
La idea de usar el
checked
atributo para escribir una casilla de verificación es inútil e innecesario. La propiedad es lo que necesitas.checked
atributofuente
value
ejemplo de Tim , por ejemplo. Una función llamadaattr
que recupera la propiedad envalue
lugar del atributo "valor" no tiene mucho sentido (y pueden ser diferentes). En el futuro,attr
hacer atributos yprop
hacer propiedades será más claro, aunque la transición será dolorosa para algunos. No tome esto de la manera incorrecta, no hay nada como retroceder y leer las especificaciones para tener una idea de qué propiedades son.value
por ejemplo), pero tratemos de ignorarlo. El 99% del tiempo, quieres trabajar con accesorios. Si necesita trabajar con un atributo real, probablemente lo sabrá.value
propiedad de una entrada no cambia suvalue
atributo en los navegadores modernos" No pensé que lo hiciera, por eso comencé a usarlo como ejemplo, pero cuando comencé a codificar el ejemplo, maldita sea si no se actualizó en Chrome, Firefox, Opera, IE ... - jsbin.com/ahire4 Resulta que era porque estaba usando uninput[type="button"]
para mi experimento. Que no actualiza el atributo en uninput[type="text"]
- jsbin.com/ahire4/2 Hablar de contorneado !! No solo el elemento, sino su tipo ...Creo que Tim lo dijo bastante bien , pero retrocedamos:
Un elemento DOM es un objeto, una cosa en la memoria. Como la mayoría de los objetos en OOP, tiene propiedades . También, por separado, tiene un mapa de los atributos definidos en el elemento (generalmente proviene del marcado que el navegador leyó para crear el elemento). Algunas de las propiedades del elemento obtienen sus valores iniciales de atributos con el mismo nombre o nombres similares (
value
obtiene su valor inicial del atributo "valor";href
obtiene su valor inicial del atributo "href", pero no es exactamente el mismo valor;className
del atributo "clase"). Otras propiedades obtienen sus valores iniciales de otras maneras: por ejemplo, laparentNode
propiedad obtiene su valor en función de cuál es su elemento padre;style
propiedad, tenga o no un atributo "estilo".Consideremos este ancla en una página en
http://example.com/testing.html
:Un poco de arte ASCII gratuito (y dejando de lado muchas cosas):
Tenga en cuenta que las propiedades y los atributos son distintos.
Ahora, aunque son distintos, debido a que todo esto evolucionó en lugar de ser diseñado desde cero, una serie de propiedades reescriben el atributo derivado si las configura. Pero no todos lo hacen, y como puede ver desde
href
arriba, el mapeo no siempre es un simple "pasar el valor", a veces hay interpretación involucrada.Cuando hablo de propiedades como propiedades de un objeto, no estoy hablando en abstracto. Aquí hay un código que no es jQuery:
(Esos valores son según la mayoría de los navegadores; hay alguna variación).
El
link
objeto es algo real, y puede ver que hay una distinción real entre acceder a una propiedad y acceder a un atributo .Como dijo Tim, la gran mayoría de las veces, queremos trabajar con propiedades. Esto se debe en parte a que sus valores (incluso sus nombres) tienden a ser más consistentes en todos los navegadores. Principalmente solo queremos trabajar con atributos cuando no hay ninguna propiedad relacionada con él (atributos personalizados), o cuando sabemos que para ese atributo en particular, el atributo y la propiedad no son 1: 1 (como con
href
y "href" arriba) .Las propiedades estándar se presentan en las diversas especificaciones DOM:
Estas especificaciones tienen índices excelentes y recomiendo tener a mano los enlaces; Los utilizo todo el tiempo.
Los atributos personalizados incluirían, por ejemplo, cualquier
data-xyz
atributo que pueda poner en elementos para proporcionar metadatos a su código (ahora que es válido a partir de HTML5, siempre y cuando se adhiera aldata-
prefijo). (Las versiones recientes de jQuery le dan acceso adata-xyz
elementos a través de ladata
función, pero esa función no es solo un descriptor de acceso a losdata-xyz
atributos [hace más y menos que eso]; a menos que realmente necesite sus características, usaría laattr
función para interactuar condata-xyz
atributo)La
attr
función solía tener una lógica complicada para obtener lo que pensaban que querías, en lugar de obtener literalmente el atributo. Combinó los conceptos. Mudarse aprop
yattr
estaba destinado a desinflarlos. Brevemente en v1.6.0 jQuery fue demasiado lejos en ese sentido, pero la funcionalidad se añadió rápidamente volver aattr
manejar las situaciones comunes donde la gente utilizaattr
cuando técnicamente se deben utilizarprop
.fuente
.attr('class', 'bla')
funciona como se esperaba para mí en 1.7.0 , 1.7.1 y 1.7.2 en Chrome 17, Firefox 11, Opera 11, IE6, IE8, IE9 y Safari 5..data
- leerá el valor predeterminado del atributo, si está presente, pero si le escribe, cambiará una propiedad oculta del elemento y no actualizará el atributo.Este cambio ha tardado mucho en llegar a jQuery. Durante años, se han contentado con una función llamada
attr()
que recuperó principalmente las propiedades DOM, no el resultado que esperarías del nombre. La segregación deattr()
yprop()
debería ayudar a aliviar parte de la confusión entre los atributos HTML y las propiedades DOM.$.fn.prop()
toma la propiedad DOM especificada, mientras que$.fn.attr()
toma el atributo HTML especificado.Para comprender completamente cómo funcionan, aquí hay una explicación extendida sobre la diferencia entre los atributos HTML y las propiedades DOM .:
Atributos HTML
Sintaxis:
<body onload="foo()">
Propósito: Permite que el marcado tenga datos asociados con él para eventos, renderización y otros fines.
Visualización: el atributo de clase se muestra aquí en el cuerpo. Es accesible a través del siguiente código:
Los atributos se devuelven en forma de cadena y pueden ser inconsistentes de un navegador a otro. Sin embargo, pueden ser vitales en algunas situaciones. Como se ejemplificó anteriormente, IE 8 Quirks Mode (y a continuación) espera el nombre de una propiedad DOM en get / set / removeAttribute en lugar del nombre del atributo. Esta es una de las muchas razones por las que es importante saber la diferencia.
Propiedades DOM
Sintaxis:
document.body.onload = foo;
Propósito: Da acceso a propiedades que pertenecen a nodos de elementos. Estas propiedades son similares a los atributos, pero solo son accesibles a través de JavaScript. Esta es una diferencia importante que ayuda a aclarar el papel de las propiedades DOM. Tenga en cuenta que los atributos son completamente diferentes de las propiedades , ya que esta asignación de controlador de eventos es inútil y no recibirá el evento (el cuerpo no tiene un evento de carga, solo un atributo de carga).
Visualización:
Aquí, verá una lista de propiedades en la pestaña "DOM" en Firebug. Estas son propiedades DOM. Inmediatamente notará algunos de ellos, ya que los habrá usado antes sin saberlo. Sus valores son los que recibirá a través de JavaScript.
Documentación
Ejemplo
HTML:
<textarea id="test" value="foo"></textarea>
JavaScript:
alert($('#test').attr('value'));
En versiones anteriores de jQuery, esto devuelve una cadena vacía. En 1.6, devuelve el valor apropiado,
foo
.Sin haber visto el nuevo código para ninguna de las funciones, puedo decir con confianza que la confusión tiene más que ver con la diferencia entre los atributos HTML y las propiedades DOM, que con el código en sí. Con suerte, esto te aclaró algunas cosas.
-Mate
fuente
$.prop()
obtiene propiedades DOM,$.attr()
obtiene atributos HTML. Estoy tratando de cerrar la brecha psicológicamente para que puedas entender la diferencia entre los dos.$('#test').prop('value')
no devuelve nada? ¿Tampoco.attr('checked')
para una casilla de verificación? Pero solía? ¿Ahora tendrías que cambiarloprop('checked')
? No entiendo la necesidad de esta distinción: ¿por qué es importante diferenciar entre los atributos HTML y las propiedades DOM? ¿Cuál es el caso de uso común que hizo que este cambio "tardara mucho en llegar" ? ¿Qué tiene de malo abstraer la distinción entre los dos, ya que parece que sus casos de uso se superponen principalmente?value
es uno de los casos más obvios, ya que lavalue
propiedad le dará el valor actual de un campo, pero elvalue
atributo le dará el valor original que se declaró en elvalue="..."
atributo, que en realidad es ladefaultValue
propiedad. (Aunque este caso en particular se confunde de nuevo por errores en IE <9.)attr('value', ...)
en jQuery <1.6 establece la propiedad, por lo que el valor actual cambia y el valor predeterminado no. En 1.6 establece el atributo, por lo que, en teoría, el valor predeterminado cambia y el valor actual no. Sin embargo, hay (más) inconsistencias en el navegador sobre qué hace exactamente la configuración delvalue
atributo. En IE también establece el valor actual; en algunos navegadores solo establece el valor actual si el valor actual no se ha establecido anteriormente. [llora]Una propiedad está en el DOM; un atributo está en el HTML que se analiza en el DOM.
Más detalles
Si cambia un atributo, el cambio se reflejará en el DOM (a veces con un nombre diferente).
Ejemplo: Cambiar el
class
atributo de una etiqueta cambiará laclassName
propiedad de esa etiqueta en el DOM. Si no tiene ningún atributo en una etiqueta, aún tiene la propiedad DOM correspondiente con un valor vacío o predeterminado.Ejemplo: Si bien su etiqueta no tiene
class
atributo, la propiedad DOMclassName
existe con un valor de cadena vacío.editar
Si cambia el uno, el otro será cambiado por un controlador, y viceversa. Este controlador no está en jQuery, sino en el código nativo del navegador.
fuente
jQuery('p').prop('className', 'foo');
en la consola de Chrome y verá cómo cada párrafo obtiene elclass
atributo thg de'foo'
. Por supuesto que no en el código fuente, que proviene del servidor. Eso es una constante.Es solo la distinción entre los atributos HTML y los objetos DOM lo que causa confusión. Para aquellos que se sienten cómodos actuando sobre los elementos DOM, las propiedades nativas como
this.src
this.value
this.checked
etc..prop
es una cálida bienvenida a la familia. Para otros, es solo una capa adicional de confusión. Vamos a aclarar eso.La forma más fácil de ver la diferencia entre
.attr
y.prop
es el siguiente ejemplo:$('input').attr('blah')
: vuelve'hello'
como se esperaba. No hay sorpresas aquí.$('input').prop('blah')
: devuelveundefined
, porque está intentando hacerlo[HTMLInputElement].blah
, y no existe tal propiedad en ese objeto DOM. Solo existe en el alcance como un atributo de ese elemento, es decir[HTMLInputElement].getAttribute('blah')
Ahora cambiamos algunas cosas así:
$('input').attr('blah')
: vuelve'apple'
eh? ¿Por qué no "pera", ya que esto se estableció en último lugar en ese elemento. Debido a que la propiedad se modificó en el atributo de entrada, no en el elemento de entrada DOM en sí mismo, básicamente funcionan casi independientemente el uno del otro.$('input').prop('blah')
: devoluciones'pear'
Lo que realmente debe tener cuidado es simplemente no mezclar el uso de estos para la misma propiedad en toda su aplicación por la razón anterior.
Vea un violín que demuestra la diferencia: http://jsfiddle.net/garreh/uLQXc/
.attr
vs.prop
:Ronda 1: estilo
.attr('style')
- devuelve estilos en línea para el elemento coincidente, es decir"font:arial;"
.prop('style')
- devuelve un objeto de declaración de estilo, es decirCSSStyleDeclaration
Ronda 2: valor
.attr('value')
- devuelve'hello'
*.prop('value')
-- devoluciones'i changed the value'
* Nota: jQuery por este motivo tiene un
.val()
método, que internamente es equivalente a.prop('value')
fuente
TL; DR
Utilizar
prop()
másattr()
en la mayoría de los casos.Una propiedad es el estado actual del elemento de entrada. Un atributo es el valor predeterminado.
Una propiedad puede contener cosas de diferentes tipos. Un atributo solo puede contener cadenas
fuente
prop() and when to go for attr()
. esperando respuesta :)Control sucio
Este concepto proporciona un ejemplo donde la diferencia es observable: http://www.w3.org/TR/html5/forms.html#concept-input-checked-dirty
Pruébalo:
prop
se marcó la casilla de verificación. ¡EXPLOSIÓN!Para algunos atributos como
disabled
onbutton
, agregar o eliminar el atributo de contenidodisabled="disabled"
siempre alterna la propiedad (llamada atributo IDL en HTML5) porque http://www.w3.org/TR/html5/forms.html#attr-fe-disabled dice:por lo que puede salirse con la suya, aunque es feo ya que modifica HTML sin necesidad.
Para otros atributos como
checked="checked"
oninput type="checkbox"
, las cosas se rompen, porque una vez que haces clic en él, se ensucia y luego agregar o quitar elchecked="checked"
atributo de contenido ya no alterna la verificación .Esta es la razón por la que debe usar principalmente
.prop
, ya que afecta la propiedad efectiva directamente, en lugar de depender de los efectos secundarios complejos de modificar el HTML.fuente
checked
atributo:checked="checked"
Todo está en el documento :
¡Así que usa utilería!
fuente
$.attr()
recuperando propiedades la mayor parte del tiempo trabajé con él, no "a veces". La confusión causada por esto todavía resuena hoy. Lamentablemente, tengo muchos problemas para encontrar una lectura definitiva sobre los atributos HTML frente a las propiedades DOM, por lo que podría escribir una respuesta aquí en un momento.los atributos están en su documento / archivo de texto HTML (== imagine que este es el resultado de su marcado html analizado), mientras que las
propiedades están en el árbol HTML DOM (== básicamente una propiedad real de algún objeto en sentido JS).
Es importante destacar que muchos de ellos están sincronizados (si actualiza la
class
propiedad, elclass
atributo en html también se actualizará; y de lo contrario). Pero algunos atributos pueden sincronizarse con propiedades inesperadas, por ejemplo, el atributochecked
corresponde a la propiedaddefaultChecked
, de modo que.prop('checked')
valor, pero no cambiará.attr('checked')
y los.prop('defaultChecked')
valores$('#input').prop('defaultChecked', true)
también cambiará.attr('checked')
, pero esto no será visible en un elemento.Y aquí hay una tabla que muestra dónde
.prop()
se prefiere (aunque.attr()
todavía se puede usar).¿Por qué a veces querrías usar .prop () en lugar de .attr () donde este último se aconseja oficialmente?
.prop()
puede devolver cualquier tipo: cadena, entero, booleano; while.attr()
siempre devuelve una cadena..prop()
se dice que es aproximadamente 2.5 veces más rápido que.attr()
.fuente
$('#myImageId').prop('src', 'http://example.com/img.png')
,var class = $('.myDivClass').prop('class')
o$('#myTextBox').prop('type', 'button')
. Y así sucesivamente ....prop()
funciona bien con todas las propiedades. No quieres marcar todas las propiedades en la.prop()
columna, ¿verdad?.prop()
se prefiere (aunque.attr()
todavía se puede usar)".attr()
para definir un evento lo.prop()
que no puede. De esta manera:$('.myDiv').attr('onclick', 'alert("Hello world!")')
. Si cambias.attr()
a.prop()
, no funcionará. Totalmente, creo que no hay razón para usar.attr()
para establecer u obtener valorid/class/href/checked/src.....
. Tenga en cuenta que no digo que esté equivocado..attr()
:.prop()
:fuente
Por lo general, querrás usar propiedades. Use atributos solo para:
<input value="abc">.
fuente
attributes
-> HTMLproperties
-> DOMfuente
attirbutes
también una de las propiedades deDOM
Antes de jQuery 1.6, el
attr()
método a veces tomaba en cuenta los valores de las propiedades al recuperar los atributos, lo que causaba un comportamiento bastante inconsistente.La introducción del
prop()
método proporciona una forma de recuperar explícitamente los valores de propiedad, mientras.attr()
recupera los atributos.Los documentos:
jQuery.attr()
Obtenga el valor de un atributo para el primer elemento del conjunto de elementos coincidentes.jQuery.prop()
Obtenga el valor de una propiedad para el primer elemento del conjunto de elementos coincidentes.fuente
Recordatorio suave sobre el uso
prop()
, por ejemplo:La función anterior se usa para verificar si checkbox1 está marcado o no, si está marcado: return 1; si no: devuelve 0. La función prop () se usa aquí como una función GET.
La función anterior se usa para configurar la casilla de verificación 1 para que se marque y SIEMPRE devuelva 1. Ahora la función prop () se usa como una función SET.
No te equivoques.
P / S: cuando reviso la propiedad Image src . Si el src está vacío, prop devuelve la URL actual de la página (incorrecto) y attr devuelve una cadena vacía (derecha).
fuente
<img src="smiley.gif" alt="Smiley face" width="42" height="42" onclick="alert($(this).prop('src'))">
. Debería funcionar y devolver la ubicación de la imagen.Una cosa
.attr()
puede hacer que.prop()
no puede: afectar a los selectores CSSAquí hay un problema que no vi en las otras respuestas.
Selector de CSS
[name=value]
.attr('name', 'value')
.prop('name', 'value')
.prop()
afecta solo unos pocos selectores de atributosinput[name]
(gracias @TimDown ).attr()
afecta a todos los selectores de atributosinput[value]
input[naame]
span[name]
input[data-custom-attribute]
(ninguno.data('custom-attribute')
afectará a este selector)fuente
Principalmente queremos usar para objetos DOM en lugar de atributos personalizados como
data-img, data-xyz
.También algunas de las diferencias al acceder al
checkbox
valor yhref
conattr()
yprop()
como la cosa cambia con la salida DOM conprop()
el enlace completo desdeorigin
y elBoolean
valor para la casilla de verificación(pre-1.6)
Solo podemos acceder a elementos DOM con
prop
otros, entonces nos daundefined
Mostrar fragmento de código
fuente
Hay algunas consideraciones más en prop () vs attr ():
selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked y defaultSelected..etc deben recuperarse y establecerse con el método .prop (). Estos no tienen los atributos correspondientes y son solo propiedades.
Para el tipo de entrada casilla de verificación
El método prop devuelve un valor booleano para marcado, seleccionado, deshabilitado, readOnly..etc, mientras que attr devuelve una cadena definida. Por lo tanto, puede usar directamente .prop ('marcado') en condición if.
.attr () llama a .prop () internamente, por lo que el método .attr () será un poco más lento que acceder a ellos directamente a través de .prop ().
fuente
La respuesta de Gary Hole es muy relevante para resolver el problema si el código está escrito de tal manera
Dado que la función prop devuelve el
CSSStyleDeclaration
objeto, el código anterior no funcionará correctamente en algunos navegadores (probadoIE8 with Chrome Frame Plugin
en mi caso).Cambiándolo así al siguiente código
resuelve el problema.
fuente