DOM Basics

Атрибуты и свойства

Понять разницу между HTML-атрибутами (в исходном HTML) и DOM-свойствами (в объекте элемента), особенно для value, checked, disabled.

Начальный (Beginner)
Нужно знать:Свойства узлов

Кратко

HTML-атрибуты — в исходном коде: <input value="5">. DOM-свойства — в объекте элемента: input.value. Они связаны, но НЕ идентичны. Атрибуты — начальные значения. Свойства — текущее состояние.


Подробно

Разница между атрибутами и свойствами:

HTML Attribute (атрибут):

  • Написан в исходном HTML: <input type="text" value="5">
  • Доступен через: element.getAttribute('value')
  • Значение ВСЕГДА строка
  • Начальное значение

DOM Property (свойство):

  • Свойство объекта элемента: element.value
  • Текущее значение (может изменяться)
  • Тип зависит от свойства (строка, число, boolean)

Пример: <input type="text" value="5">

input.getAttribute('value') // '5' (строка!) input.value // 5 (может быть числом)

input.value = 10; input.getAttribute('value') // всё ещё '5' (атрибут не изменился!) input.value // 10 (свойство изменилось)

Ключевые атрибуты/свойства:

  • value:

- Атрибут: начальное значение - Свойство: текущее значение

  • checked:

- Атрибут: 'checked' или отсутствует - Свойство: true/false

  • disabled:

- Атрибут: 'disabled' или отсутствует - Свойство: true/false

  • class:

- Атрибут: class="btn primary" - Свойство: element.className = 'btn primary' - Лучше: element.classList.add('btn')

  • id:

- Атрибут: id="app" - Свойство: element.id = 'app'

Когда что использовать:

  • getAttribute/setAttribute — для начальных значений
  • element.property — для текущего состояния
  • Для большинства свойств — используйте свойства (element.value)

Ментальная модель

Атрибут — как описание в анкете (начальные данные). Свойство — как текущее состояние в базе данных (может меняться). Вы заполнили анкету «возраст: 25», но в базе уже «возраст: 26».


Примеры

**Самый простой:**

javascript
// HTML: <input type="text" value="5" id="myInput">

const input = document.getElementById('myInput');

// Атрибут (начальное значение):
console.log(input.getAttribute('value')); // '5'

// Свойство (текущее значение):
console.log(input.value); // '5'

// Изменяем свойство:
input.value = '10';
console.log(input.value);            // '10'
console.log(input.getAttribute('value')); // всё ещё '5'!

Атрибут не меняется при изменении свойства. Они независимы.

**Простой:**

javascript
// HTML: <input type="checkbox" checked>

const checkbox = document.querySelector('input[type=checkbox]');

// Атрибут:
console.log(checkbox.getAttribute('checked')); // '' (пустая строка)

// Свойство:
console.log(checkbox.checked); // true

// Снимаем галочку:
checkbox.checked = false;
console.log(checkbox.checked);            // false
console.log(checkbox.getAttribute('checked')); // всё ещё ''!

checked — boolean свойство. Атрибут — строка. Они работают по-разному.

**Реальный пример:**

javascript
// Практический пример: валидация формы
const emailInput = document.querySelector('#email');

// Проверяем текущее значение (свойство):
if (emailInput.value.includes('@')) {
  emailInput.classList.add('valid');
} else {
  emailInput.classList.add('invalid');
}

// Устанавливаем начальное значение (атрибут):
emailInput.setAttribute('placeholder', 'user@example.com');

// Проверяем обязательность (свойство):
console.log(emailInput.required); // true

Для работы с текущим состоянием — свойства. Для начальных значений — атрибуты.


Частые ошибки

**Неправильно:** Путать getAttribute и свойства

**Почему:** getAttribute возвращает строку. Свойство может быть числом, boolean и т.д.

**Правильно:** getAttribute('value') → '5' (строка). element.value → 5 (может быть числом).

**Неправильно:** Думать, что setAttribute меняет свойства

**Почему:** setAttribute меняет атрибут. Свойства могут не обновиться.

**Правильно:** Для текущего состояния — изменяйте свойства напрямую: element.value = 'новое'.

**Неправильно:** Использовать class вместо classList

**Почему:** element.className = 'btn primary' заменяет ВСЕ классы. classList.add — добавляет один.

**Правильно:** Используйте classList.add/remove/toggle для управления отдельными классами.


Важно запомнить

  • Attribute — начальное значение в HTML. Property — текущее состояние.
  • getAttribute всегда возвращает строку
  • Свойства могут быть строками, числами, boolean
  • Изменение свойства НЕ меняет атрибут
  • Для текущего состояния — свойства

Связь

Назад: Вы умеете читать содержимое (D4) — теперь вы понимаете более глубокое различие атрибутов и свойств.

Вперёд: Следующий урок (D6) — манипуляции с DOM: создание, добавление и удаление элементов.

Материалы курса DOM Basics — PROlab Academy.