Свойство value в JavaScript

Свойство value содержит текущее значение элемента формы. Через него можно прочитать данные, которые ввёл или выбрал пользователь, а также изменить значение из JavaScript.

const currentValue = element.value;
element.value = 'Новое значение';

value является свойством, а не методом, поэтому круглые скобки после него не ставятся. Конкретный результат зависит от элемента и его типа.

Получение значения

Создадим поле с начальным текстом:

<label for="username">Имя</label>
<input id="username" type="text" value="Анна">

Найдём элемент и прочитаем его value:

const usernameInput = document.querySelector('#username');

console.log(usernameInput.value); // Анна

Если пользователь изменит текст, свойство сразу будет содержать новое значение. Оно отражает текущее состояние поля, а не только исходную HTML-разметку.

У пустого текстового поля value содержит пустую строку:

<input class="search-input" type="search">
const searchInput = document.querySelector('.search-input');

console.log(searchInput.value); // ''

Для проверки на пустое значение можно использовать строгое сравнение:

if (searchInput.value === '') {
  console.log('Строка поиска не указана');
}

Изменение значения

Присваивание нового значения сразу изменяет содержимое поля на странице:

usernameInput.value = 'Мария';

console.log(usernameInput.value); // Мария

Чтобы очистить поле, присвойте пустую строку:

usernameInput.value = '';

Можно использовать и вычисленное значение. Например, удалим пробелы по краям введённой строки:

usernameInput.value = usernameInput.value.trim();

Метод trim() возвращает новую строку, после чего она записывается обратно в поле. Само свойство value при чтении не изменяет данные.

value возвращает строку

У элементов формы value обычно возвращает строку. Это относится и к полю type=“number”:

<input class="quantity-input" type="number" value="5">
const quantityInput = document.querySelector('.quantity-input');

console.log(quantityInput.value); // '5'
console.log(typeof quantityInput.value); // string

Если число требуется для вычислений, можно использовать valueAsNumber:

const quantity = quantityInput.valueAsNumber;

console.log(quantity); // 5

Пустое или некорректное числовое поле вернёт через valueAsNumber значение NaN. Обычное value при этом останется строкой.

Формат значения зависит от типа поля. Например, input type=“date” возвращает строку вида YYYY-MM-DD, а input type=“color” - строку с цветом вида #336699.

value у textarea

Текущий текст внутри textarea также находится в свойстве value:

<textarea class="comment-field">Исходный комментарий</textarea>
const commentField = document.querySelector('.comment-field');

console.log(commentField.value); // Исходный комментарий

commentField.value = 'Новый комментарий';

Для работы с текстом, который пользователь вводит в textarea, не используйте textContent или innerHTML. Эти свойства относятся к содержимому разметки, а текущее состояние поля доступно через value.

value у select и option

У элемента select свойство value содержит значение первого выбранного пункта:

<select class="language-select">
  <option value="js">JavaScript</option>
  <option value="python">Python</option>
  <option value="go">Go</option>
</select>
const languageSelect = document.querySelector('.language-select');

console.log(languageSelect.value); // js

languageSelect.value = 'python';
console.log(languageSelect.value); // python

При присваивании браузер выбирает option с таким значением. Если совпадения нет, выбор снимается, selectedIndex становится равным -1, а select.value возвращает пустую строку.

languageSelect.value = 'rust';

console.log(languageSelect.value); // ''
console.log(languageSelect.selectedIndex); // -1

У самого option свойство value берётся из одноимённого атрибута:

const firstOption = languageSelect.options[0];

console.log(firstOption.value); // js
console.log(firstOption.textContent); // JavaScript

Если у option нет атрибута value, значением становится его текст.

<option>JavaScript</option>

У списка с атрибутом multiple свойство value возвращает только значение первого выбранного пункта. Для получения всех вариантов нужно перебрать коллекцию selectedOptions.

value у checkbox и radio

У checkbox и radio свойство value не показывает, выбран ли элемент. Оно содержит данные, которые связаны с этим вариантом:

<label>
  <input class="agreement" type="checkbox" value="accepted">
  Я принимаю условия
</label>
const agreementCheckbox = document.querySelector('.agreement');

console.log(agreementCheckbox.value); // accepted
console.log(agreementCheckbox.checked); // true или false

value останется строкой ‘accepted’ и у отмеченного, и у неотмеченного checkbox. Его состояние хранится отдельно в свойстве checked.

Если атрибут value не указан, стандартным значением checkbox или radio будет строка ‘on’:

<input class="option-checkbox" type="checkbox">
const optionCheckbox = document.querySelector('.option-checkbox');

console.log(optionCheckbox.value); // on

Поэтому вариантам checkbox и radio, данные которых отправляются с формой, обычно задают понятные значения явно.

value у input type=“file”

У файлового поля value не предоставляет доступ к выбранному файлу. Браузер может вернуть служебную строку наподобие C:\fakepath\photo.jpg, но настоящий путь к файлу скрыт.

Для работы с выбранными файлами используют свойство files:

<input class="document-input" type="file">
const fileInput = document.querySelector('.document-input');
const file = fileInput.files[0];

if (file) {
  console.log(file.name);
  console.log(file.size);
}

Записать произвольный путь в fileInput.value нельзя. Разрешена пустая строка, которая очищает поле:

fileInput.value = '';

Атрибут value и свойство defaultValue

HTML-атрибут value задаёт начальное значение обычного input. DOM-свойство value содержит текущее значение, а defaultValue - значение, к которому поле вернётся после сброса формы.

<form class="city-form">
  <input class="city-input" type="text" value="Москва">
</form>
const cityForm = document.querySelector('.city-form');
const cityInput = document.querySelector('.city-input');

cityInput.value = 'Казань';

console.log(cityInput.value); // Казань
console.log(cityInput.defaultValue); // Москва
console.log(cityInput.getAttribute('value')); // Москва

Присваивание свойству value не меняет HTML-атрибут. Если поле находится в форме и вызвать reset(), текущее значение снова станет равным defaultValue.

cityForm.reset();
console.log(cityInput.value); // Москва

Новую точку сброса можно задать через defaultValue:

cityInput.defaultValue = 'Самара';
cityForm.reset();

console.log(cityInput.value); // Самара

Для обычного изменения видимого значения используйте value. Обращаться к defaultValue нужно только тогда, когда требуется изменить именно исходное состояние поля.

Изменение value и события

При вводе пользователя браузер создаёт событие input. В обработчике value уже содержит обновлённое значение:

usernameInput.addEventListener('input', function (event) {
  console.log(event.currentTarget.value);
});

Присваивание через JavaScript само по себе не вызывает события input или change:

usernameInput.value = 'Ольга';

Если от значения зависит другая часть интерфейса, удобно вынести её обновление в функцию и вызывать эту функцию как из обработчика, так и после программного изменения:

<p>Имя: <span class="name-preview"></span></p>
const namePreview = document.querySelector('.name-preview');

function updateNamePreview() {
  namePreview.textContent = usernameInput.value;
}

usernameInput.addEventListener('input', updateNamePreview);

usernameInput.value = 'Ольга';
updateNamePreview();

Так поведение кода не зависит от искусственного создания событий, а обновление интерфейса остаётся в одном месте.

Итого

Свойство value используют для чтения и изменения текущего значения элементов формы. У input и textarea оно содержит введённую строку, у select - значение первого выбранного пункта, а у option - значение варианта.

У checkbox и radio выбор проверяют через checked, а у файлового поля сами файлы получают через files. Начальное значение обычного input хранится в defaultValue. Программное присваивание value изменяет поле, но не запускает события input и change.