Различия между attr() и prop()

В jQuery методы attr() и prop() используются для работы с атрибутами и свойствами HTML-элементов. Несмотря на внешнюю схожесть, между ними существуют принципиальные различия, которые влияют на поведение кода и корректность взаимодействия с DOM.


Основное различие: атрибуты vs свойства

  • attr() предназначен для получения и изменения атрибутов HTML-элемента, как они заданы в исходном HTML-коде. Атрибуты отражают начальные значения элементов при загрузке страницы.
  • prop() работает с свойствами DOM-элемента, которые могут изменяться динамически в процессе работы страницы. Свойства всегда отражают актуальное состояние элемента в DOM.

Пример:

<input type="checkbox" id="check1" checked>
// Получение значения через attr
console.log($('#check1').attr('checked')); // "checked" — значение из HTML

// Получение состояния через prop
console.log($('#check1').prop('checked')); // true или false — текущее состояние

В данном примере атрибут checked сохраняет значение, указанное в HTML, а свойство checked отражает фактическое состояние флажка после взаимодействия пользователя.


Изменение значений

Методы также различаются при изменении:

  • attr() меняет атрибут в HTML-коде, что не всегда влияет на поведение элемента в браузере.
  • prop() напрямую меняет свойство DOM, что сразу отражается в визуальном состоянии элемента и логике работы страницы.

Пример:

$('#check1').attr('checked', false); // атрибут изменен, но флажок может остаться отмеченным
$('#check1').prop('checked', false); // флажок будет снят в интерфейсе

Применение по типам элементов

  1. Флажки и радиокнопки (checkbox, radio) Всегда использовать prop() для управления состоянием (checked), так как только свойства отражают актуальное состояние элемента.

  2. Селекты и опции (select, option) Для выбора элементов также правильнее применять prop('selected', true/false) вместо attr('selected').

  3. Текстовые поля (input[type=text], textarea) Атрибут value через attr() показывает значение, заданное в HTML, тогда как prop('value') — текущее значение, введённое пользователем.

  4. Ссылки и изображения Для href, src иногда допустимо использовать attr(), потому что эти значения редко изменяются динамически. Если же требуется получить актуальный путь, который может быть изменен скриптами, предпочтительнее prop().


Особенности удаления и проверки

  • removeAttr('attrName') удаляет атрибут элемента.
  • removeProp('propName') удаляет свойство элемента, что используется редко и может вызвать неожиданные эффекты.

Проверка наличия атрибута:

if ($('#element').attr('disabled')) {
    console.log('Атрибут disabled существует');
}

Проверка свойства:

if ($('#element').prop('disabled')) {
    console.log('Элемент реально заблокирован');
}

Разница особенно важна для динамических изменений состояния формы: атрибут может оставаться в HTML, но элемент уже разблокирован через свойство.


Практическое правило выбора

  • Использовать prop() для состояния и поведения элемента: checked, selected, disabled, readonly.
  • Использовать attr() для статических данных и метаданных: id, class, name, data-*, href, src.
  • Для динамических изменений состояния формы всегда предпочтительно prop(), чтобы избежать несоответствия визуального состояния и данных в HTML.

Сравнение в таблице

Метод Что изменяет Пример атрибутов/свойств Рекомендация использования
attr() HTML-атрибут id, name, class, href, src, value (начальное) Для статических значений и метаданных
prop() Свойство DOM checked, selected, disabled, value (текущее) Для состояния элемента и динамических изменений

Взаимодействие с новыми элементами

При создании элементов через jQuery, prop() автоматически устанавливает свойства в соответствии с типом элемента. Атрибуты при этом могут оставаться пустыми или иметь значение по умолчанию:

let $checkbox = $('<input type="checkbox">');
$checkbox.prop('checked', true); // отмечен
$checkbox.attr('checked');       // undefined или пусто

Итоговое понимание

attr() и prop() выполняют схожие действия, но работают на разных уровнях DOM. Правильное использование этих методов критично для стабильного поведения интерактивных элементов, особенно форм и управления состоянием интерфейса. Игнорирование различий может приводить к ошибкам, когда визуальное состояние элемента не соответствует данным, хранящимся в HTML.