Что происходит за .setAttribute vs .attribute =?
Описание:
Я использую простой javascript
чтобы установить значение input
. Я использую несколько методов, которые кажутся одинаковыми, но с разными результатами. Вот пример:
HTML:
<input name="testinput" value="" type="text" />
Javascript:
var input = document.getElementByTagName('input')[0];
input.value = "5"
console.log(input.value) // returns "5"
console.log(input.getAttribute("value")) // returns ""
Конечно, при использовании функции setAttribute()
функциональность меняется на setAttribute()
. Тем не менее, при отправке формы они оба дают результат input=5
.
Вопрос:
Какой смысл разделять два свойства? .value
хранится не так, как .getAttribute("value")
?
Отказ от ответственности:
Я прочитал:
Оба этих вопроса/ответов оставили меня смущенным и неудовлетворенным.
Ответы
Ответ 1
input.value
является точечной нотацией, она устанавливает свойство value
входного объекта.
Он никоим образом не обновляет атрибуты, поэтому попытка получить атрибут с тем же именем будет не возвращать обновленное значение.
Если по какой-то причине вам нужно обновить атрибут, вы бы сделали
input.setAttribute('value', 'new_value');
но вам не следует использовать это, поскольку вы обычно должны работать со свойствами, а не с атрибутами, и вы должны установить и получить свойство value
, а не атрибут.
Атрибут в HTML - это пара ключ/значение внутри открывающих и закрывающих скобок, как в
<div attribute="attribute_value"></div>
Во многих случаях такие атрибуты будут устанавливать начальное значение базового свойства, а свойство - это именованный ключ со значением, который привязан к внутренней модели элемента, к чему мы обращаемся с javascript, объект удерживая модель и данные для элемента.
Изменение любого из этих объектов ключей или значений не изменяет HTML, а только внутреннее представление элемента, объекта. Однако изменение атрибутов HTML в некоторых случаях изменяет представление объекта.
getAttribute
получает фактические атрибуты из HTML, а не свойства, а element.value
явно обращается к именованному свойству в объекте, представляющем этот элемент.
Ответ 2
Важно учитывать различия между атрибутами и свойствами.
Атрибут value
Атрибут value
<input>
, видимый в представлении HTML элемента, отображается в свойство defaultValue
. Например:
var i = document.createElement('input');
i.setAttribute('value', 'foo');
console.log(i.defaultValue, i.getAttribute('value')); // "foo foo"
i.defaultValue = 'bar';
console.log(i.defaultValue, i.getAttribute('value')); // "bar bar"
Свойство value
Свойство value
отражает свойство defaultValue
(и атрибут value
), пока оно явно не получит значение, поэтому:
var i = document.createElement('input');
i.defaultValue = 'foo';
console.log(i.value); // "foo"
i.value = 'bar';
i.defaultValue = 'foo';
console.log(i.value); // "bar"
Это еще один способ взглянуть на это:
<input value="foo">
↑↓
input.defaultValue = "foo";
↓
input.value
get(): value === undefined ? input.defaultValue : value
set(newValue): value := newValue
Якоря
При использовании якорей атрибут href
и свойство href
обновляют друг друга, но по-другому, например:
var a = document.createElement('a');
a.setAttribute('href', '/test');
console.log(a.href); // "http://stackoverflow.com/test"
a.href = '/test';
console.log(a.getAttribute('href')); // "/test"
Другие элементы
Здесь (частичный) список атрибутов и их соответствующие свойства:
element | attribute | property
---------+-----------+----------------
option | selected | defaultSelected (bool)
label | for | htmlFor
input | checked | defaultChecked (bool)
select | multiple | multiple (bool)
li | value | value (int)
Как вы можете видеть, тогда как атрибуты всегда являются строками, соответствующие свойства могут быть других типов.