Синхронизация между атрибутами и свойствами
Когда стандартный атрибут изменяется, соответствующее свойство автоматически обновляется. Это работает и в обратную сторону (за некоторыми исключениями).
В примере ниже id
модифицируется как атрибут, и можно увидеть, что свойство также изменено. То же самое работает и в обратную сторону:
<input>
<script>
let input = document.querySelector('input');
// атрибут => свойство
input.setAttribute('id', 'id');
alert(input.id); // id (обновлено)
// свойство => атрибут
input.id = 'newId';
alert(input.getAttribute('id')); // newId (обновлено)
</script>
Но есть и исключения, например, input.value
синхронизируется только в одну сторону – атрибут → значение, но не в обратную:
<input>
<script>
let input = document.querySelector('input');
// атрибут => значение
input.setAttribute('value', 'text');
alert(input.value); // text
// свойство => атрибут
input.value = 'newValue';
alert(input.getAttribute('value')); // text (не обновилось!)
</script>
В примере выше:
- Изменение атрибута
value
обновило свойство. - Но изменение свойства не повлияло на атрибут.
Иногда эта «особенность» может пригодиться, потому что действия пользователя могут приводить к изменениям value
, и если после этого мы захотим восстановить «оригинальное» значение из HTML, оно будет в атрибуте.
DOM-свойства типизированы
DOM-свойства не всегда являются строками. Например, свойство input.checked
(для чекбоксов) имеет логический тип:
<input id="input" type="checkbox" checked> checkbox
<script>
alert(input.getAttribute('checked')); // значение атрибута: пустая строка
alert(input.checked); // значение свойства: true
</script>
Есть и другие примеры. Атрибут style
– строка, но свойство style
является объектом:
<div id="div" style="color:red;font-size:120%">Hello</div>
<script>
// строка
alert(div.getAttribute('style')); // color:red;font-size:120%
// объект
alert(div.style); // [object CSSStyleDeclaration]
alert(div.style.color); // red
</script>
Хотя большинство свойств, всё же, строки.
При этом некоторые из них, хоть и строки, могут отличаться от атрибутов. Например, DOM-свойство href
всегда содержит полный URL, даже если атрибут содержит относительный URL или просто #hash
.
Ниже пример:
<a id="a" href="#hello">link</a>
<script>
// атрибут
alert(a.getAttribute('href')); // #hello
// свойство
alert(a.href ); // полный URL в виде http://site.com/page#hello
</script>
Если же нужно значение href
или любого другого атрибута в точности, как оно записано в HTML, можно воспользоваться getAttribute
.