В jQuery методы attr() и prop()
используются для работы с атрибутами и свойствами HTML-элементов.
Несмотря на внешнюю схожесть, между ними существуют принципиальные
различия, которые влияют на поведение кода и корректность взаимодействия
с DOM.
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); // флажок будет снят в интерфейсе
Флажки и радиокнопки (checkbox,
radio) Всегда использовать prop() для
управления состоянием (checked), так как только свойства
отражают актуальное состояние элемента.
Селекты и опции (select,
option) Для выбора элементов также правильнее
применять prop('selected', true/false) вместо
attr('selected').
Текстовые поля (input[type=text],
textarea) Атрибут value через
attr() показывает значение, заданное в HTML, тогда как
prop('value') — текущее значение, введённое
пользователем.
Ссылки и изображения Для 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.