.prop() vs .attr() em jQuery: análise passo a passo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que este tópico é tão importante?

\n

Se você já escreveu código jQuery que precisava obter ou definir o valor de um atributo em um elemento HTML, certamente já se deparou com dois métodos: .prop() e .attr(). À primeira vista, eles fazem a mesma coisa. Mas, na prática, a diferença entre eles é a fonte de centenas de bugs e milhares de perguntas no Stack Overflow.

\n

Neste tutorial passo a passo, vamos entender de uma vez por todas as diferenças entre .prop() e .attr() em jQuery, quando usar cada um e como não cair em armadilhas. Escreveremos código real, observaremos o comportamento real do navegador e memorizaremos uma regra simples.

\n

Este artigo não é uma documentação seca. É o seu guia pessoal sobre um dos tópicos mais confusos do jQuery.

\n\n

Resumindo: atributos vs propriedades

\n

Antes de mergulharmos no código, vamos entender a teoria. No DOM (Modelo de Objeto de Documento), existem dois conceitos:

\n
    \n
  • Atributo (attribute) — o que está escrito no código HTML. Por exemplo, <input type="checkbox" checked="checked">. Atributos são sempre strings.
  • \n
  • Propriedade (property) — o que é armazenado no objeto do elemento DOM após o navegador ler o HTML. As propriedades podem ser de qualquer tipo de dado: string, booleano, número, objeto.
  • \n
\n

O método .attr() trabalha com atributos. O método .prop() trabalha com propriedades. Parece simples? Sim, mas há nuances.

\n\n

A principal armadilha: atributos booleanos

\n

O exemplo mais popular que confunde iniciantes são as caixas de seleção, botões de rádio e outros elementos com atributos booleanos (checked, disabled, selected, readonly).

\n

Imagine que você tem este HTML:

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

Você quer verificar se a caixa de seleção está marcada. Logicamente, você escreveria assim:

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

Aí está a diferença! .attr() retorna a string "checked" se o atributo existir no HTML e undefined se não existir. Já .prop() retorna true ou false, dependendo do estado atual do elemento no DOM.

\n

Agora, o mais interessante: o que acontece se o usuário desmarcar a caixa?

\n
// Depois que o usuário desmarcou a caixa:\nconsole.log( $('#myCheckbox').attr('checked') ); // "checked"! (o HTML não mudou)\nconsole.log( $('#myCheckbox').prop('checked') ); // false (o estado mudou)
\n

É por isso que usar .attr() para verificar o estado de uma caixa de seleção é um erro. O atributo checked no HTML permanece inalterado, enquanto a propriedade checked no DOM muda dinamicamente. .prop() sempre fornece a resposta atual.

\n\n

A regra prática

\n

Existe uma regra simples que o ajudará a não errar:

\n
    \n
  • Use .prop() quando precisar obter ou alterar o estado dinâmico de um elemento (por exemplo, checked, disabled, selected, value de um input).
  • \n
  • Use .attr() quando precisar ler ou alterar um atributo estático do HTML (por exemplo, href, src, data-*, id, class).
  • \n
\n

Lembre-se: .prop() é para propriedades que mudam durante a execução. .attr() é para atributos definidos na marcação.

\n\n

Exemplo passo a passo: trabalhando com disabled

\n

Vamos analisar outro caso clássico — um botão com o atributo disabled.

\n
<button id="myButton" disabled>Clique em mim</button                

Blogs

Book Recommendations