Ответ 1
При написании исходного кода HTML вы можете определять атрибуты на своих HTML-элементах. Затем, как только браузер проанализирует ваш код, будет создан соответствующий узел DOM. Этот узел является объектом, и поэтому он имеет свойства.
Например, этот HTML-элемент:
<input type="text" value="Name:">
имеет 2 атрибута (type
и value
).
Когда браузер проанализирует этот код, будет создан объект HTMLInputElement, и этот объект будет содержать десятки таких свойств, как: accept, accessKey, align, alt, атрибуты, автофокус, baseURI, checked, childElementCount, childNodes, children, classList, className, clientHeight и т.д.
Для данного объекта узла DOM свойства являются свойствами этого объекта, а атрибуты являются элементами свойства attributes
этого объекта.
Когда узел DOM создается для данного элемента HTML, многие его свойства относятся к атрибутам с одинаковыми или похожими именами, но это не взаимно однозначное отношение. Например, для этого элемента HTML:
<input id="the-input" type="text" value="Name:">
соответствующий узел DOM будет иметь свойства id
, type
и value
(среди прочих):
-
Свойство
id
является отраженным свойством для атрибутаid
: получение свойства считывает значение атрибута, а свойство свойства записывает значение атрибута.id
является чистым отраженным свойством, он не изменяет и не ограничивает значение. -
Свойство
type
является отраженным свойством для атрибутаtype
: получение свойства считывает значение атрибута, а свойство свойства записывает значение атрибута.type
не является чистым отраженным свойством, поскольку он ограничен известными значениями (например, действительными типами ввода). Если у вас есть<input type="foo">
, тогдаtheInput.getAttribute("type")
дает вам"foo"
ноtheInput.type
дает вам"text"
. -
Напротив, свойство
value
не отражает атрибутvalue
. Вместо этого это текущее значение входа. Когда пользователь вручную изменит значение поля ввода, свойствоvalue
будет отражать это изменение. Поэтому, если пользователь вводит"John"
в поле ввода, то:theInput.value // returns "John"
в то время как:
theInput.getAttribute('value') // returns "Name:"
Свойство
value
отражает текущее текстовое содержимое внутри поля ввода, тогда как атрибутvalue
содержит исходный текст-контент атрибутаvalue
из исходного кода HTML.Поэтому, если вы хотите узнать, что в настоящее время находится в текстовом поле, прочитайте свойство. Если вы, однако, хотите знать, что такое начальное значение текстового поля, прочитайте атрибут. Или вы можете использовать свойство
defaultValue
, которое является чистым отражением атрибутаvalue
:theInput.value // returns "John" theInput.getAttribute('value') // returns "Name:" theInput.defaultValue // returns "Name:"
Есть несколько свойств, которые непосредственно отражают их атрибут (rel
, id
), некоторые - прямые отражения с немного разными именами (htmlFor
отражает атрибут for
, className
отражает атрибут class
), многие из которых отражают их атрибут, но с ограничениями/модификациями (src
, href
, disabled
, multiple
) и т.д. Спектр охватывает различные виды отражения.