.prop() vs .attr() en jQuery: análisis paso a paso con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿por qué es tan importante este tema?

\n

Si alguna vez has escrito código jQuery que debía obtener o establecer el valor de un atributo en un elemento HTML, seguramente te has encontrado con dos métodos: .prop() y .attr(). A primera vista hacen lo mismo. Pero en la práctica, la diferencia entre ellos es la fuente de cientos de errores y miles de preguntas en Stack Overflow.

\n

En este tutorial paso a paso entenderemos de una vez por todas en qué se diferencian .prop() y .attr() en jQuery, cuándo usar cada uno y cómo no caer en la trampa. Escribiremos código real, observaremos el comportamiento real del navegador y recordaremos una regla simple.

\n

Este artículo no es documentación árida. Es tu guía personal sobre uno de los temas más confusos de jQuery.

\n\n

Brevemente: atributos vs propiedades

\n

Antes de sumergirnos en el código, analicemos la teoría. En el DOM (Modelo de Objetos del Documento) existen dos conceptos:

\n
    \n
  • Atributo (attribute) — lo que está escrito en el código HTML. Por ejemplo, <input type="checkbox" checked="checked">. Los atributos siempre son cadenas de texto.
  • \n
  • Propiedad (property) — lo que se almacena en el objeto del elemento DOM después de que el navegador ha leído el HTML. Las propiedades pueden ser de cualquier tipo de dato: cadena, booleano, número, objeto.
  • \n
\n

El método .attr() trabaja con atributos. El método .prop() trabaja con propiedades. ¿Suena simple? Sí, pero hay matices.

\n\n

La trampa principal: atributos booleanos

\n

El ejemplo más popular que confunde a los principiantes son las casillas de verificación, los botones de radio y otros elementos con atributos booleanos (checked, disabled, selected, readonly).

\n

Imagina que tienes este HTML:

\n
<input type="checkbox" id="myCheckbox" checked>
\n

Quieres comprobar si la casilla está marcada. Lógicamente escribirías:

\n
console.log( $('#myCheckbox').attr('checked') ); // "checked" (¡cadena!)\nconsole.log( $('#myCheckbox').prop('checked') ); // true (¡booleano!)
\n

¡Ahí está la diferencia! .attr() devuelve la cadena "checked" si el atributo está presente en el HTML, y undefined si no lo está. Mientras que .prop() devuelve true o false, dependiendo del estado actual del elemento en el DOM.

\n

Ahora lo más interesante: ¿qué sucede si el usuario desmarca la casilla?

\n
// Después de que el usuario desmarcó la casilla:\nconsole.log( $('#myCheckbox').attr('checked') ); // "checked"! (el HTML no cambió)\nconsole.log( $('#myCheckbox').prop('checked') ); // false (el estado cambió)
\n

Por eso usar .attr() para comprobar el estado de una casilla de verificación es un error. El atributo checked en el HTML permanece sin cambios, mientras que la propiedad checked en el DOM cambia dinámicamente. .prop() siempre da la respuesta actualizada.

\n\n

La regla del pulgar

\n

Hay una regla simple que te ayudará a no equivocarte:

\n
    \n
  • Usa .prop() cuando necesites obtener o cambiar el estado dinámico de un elemento (por ejemplo, checked, disabled, selected, value en un input).
  • \n
  • Usa .attr() cuando necesites leer o cambiar un atributo estático del HTML (por ejemplo, href, src, data-*, id, class).
  • \n
\n

Recuerda: .prop() es para propiedades que cambian durante la ejecución. .attr() es para atributos definidos en el marcado.

\n\n

Ejemplo paso a paso: trabajando con disabled

\n

Analicemos otro caso clásico: un botón con el atributo disabled.

\n
<button id="myButton" disabled>Púlsame</button                

Blogs

Book Recommendations