Атрибут required в HTML: что это и для чего нужен

Атрибут required (по-русски «обязательный») сообщает браузеру, что поле нужно заполнить: пока оно пустое, форма не отправится, а рядом с полем появится сообщение. Атрибут булевый, достаточно одного слова в теге. Работает он в <input>, <select> и <textarea>, а проверку делает сам браузер, без скриптов.

Атрибут required в HTML: что это и для чего нужен

Слово required переводится как «обязательный». Атрибут нужен там, где без значения форма бессмысленна: адрес для ответа, согласие с условиями, номер телефона для связи. Записывают его одним словом в открывающем теге.

HTML
<form>
  <input type="email" required>
  <button type="submit">Отправить</button>
</form>
Результат

Нажмите кнопку при пустом поле: форма не отправилась (submit равно нулю), сработало событие invalid. Введите адрес и нажмите ещё раз.

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

Для каких тегов и типов input работает required

Атрибут работает у <input> с большинством типов, а также у <textarea> и <select>. Для типов, у которых значение есть всегда, или у которых его нельзя заполнить, он ничего не делает. В демонстрации выберите элемент и посмотрите, считает ли браузер пустое поле незаполненным.

HTML
<input type="text" required>
<input type="range" required>
<textarea required></textarea>
<select required>
  <option value="">Выберите</option>
</select>
Результат

У text, email, number, date, checkbox, radio, file, textarea и select пустое поле незаполнено. У color и range значение есть всегда, а у hidden поле не проверяется.

Где прописан requiredЧто значит «заполнено»Работает
text, search, url, tel, email, passwordВ поле есть хотя бы один символДа
number, date, time, month, week, datetime-localВыбрано значениеДа
checkboxФлажок отмеченДа
radioОтмечена любая кнопка группыДа
fileВыбран файлДа
<textarea>В поле есть хотя бы один символДа
<select>Выбран пункт с непустым значениемДа
color, rangeЗначение есть всегдаНет смысла
hidden, submit, reset, button, imageПосетитель не заполняет эти поляНет

У <button>, <fieldset>, <div> и <a> атрибута required нет. Подробнее о значениях type рассказано в уроке «Поля ввода: input и его типы ».

Как записать атрибут required: какие у него бывают значения

Атрибут булевый: важно только его присутствие. Записи required и required="required" равны между собой, а значение в кавычках браузер не читает.

HTML
<input required>
<input required="required">
<input required="false">
<input>
Результат

У первых трёх полей атрибут действует, включая запись required="false". Не обязательно только четвёртое поле, у которого атрибута нет.

Запись required="false" не отключает проверку, это частая ошибка. Чтобы сделать поле необязательным, атрибут нужно убрать из тега целиком.

Что считается заполненным полем при required: пробелы, select и radio

Браузер проверяет только наличие значения, а не его смысл. Три случая надо знать заранее. Поле, где записаны одни пробелы, заполненным считается. У <select> первый пункт со значением value="" играет роль подсказки и не засчитывается, а первый пункт без атрибута value засчитывается, потому что его текст становится значением. У группы переключателей достаточно прописать required одной кнопке: обязательной становится вся группа.

HTML
<input required value="   ">

<select required>
  <option value="">Выберите</option>
  <option value="1">Один</option>
</select>

<input type="radio" name="g" required> Один
<input type="radio" name="g"> Два
Результат

Поле с пробелами проходит проверку. Список с пустым value не проходит, пока не выбран другой пункт. В группе radio достаточно отметить любую кнопку.

Чтобы пробелы не проходили, к полю добавляют проверку через pattern или обрезают значение скриптом. Переключатели обязательно объединяют общим name. Без него required на кнопке не срабатывает совсем: одиночная кнопка без name с этим атрибутом считается заполненной даже без отметки. Для группы флажков с общим name обязательными считаются только те, у которых прописан required.

Что делает required при отправке: invalid, novalidate и formnovalidate

Если обязательное поле пустое, браузер не отправляет форму: событие submit не происходит, зато на поле срабатывает событие invalid, а фокус переходит к первому неверному полю. Проверку можно отключить целиком атрибутом novalidate у формы или у одной кнопки отправки атрибутом formnovalidate. Метод form.requestSubmit() проверку запускает, как и обычная кнопка.

HTML
<form>
  <input name="a" required>
  <button type="submit">Отправить</button>
  <button type="submit" formnovalidate>Без проверки</button>
</form>

<form novalidate>...</form>
Результат

Обычная кнопка и requestSubmit() дают только invalid. Кнопка с formnovalidate и форма с novalidate отправляются, хотя поле пусто.

Метод form.submit() проверку не запускает: он отправляет форму сразу. Подробнее о проверке полей рассказано в уроке «Встроенная валидация форм ».

Как изменить сообщение required: setCustomValidity

Стандартный текст ошибки нельзя задать атрибутом, но можно заменить из скрипта через setCustomValidity(). Вызов нужно делать в обработчике invalid, а при вводе обязательно сбрасывать сообщение пустой строкой: пока оно не пустое, поле считается неверным.

JavaScript
const city = document.querySelector('#city');

city.addEventListener('invalid', () => {
  city.setCustomValidity('Введите название города');
});

city.addEventListener('input', () => {
  city.setCustomValidity(''); // без сброса поле останется неверным
});
Результат

Нажмите «Проверить» при пустом поле, потом введите слово: сообщение сбрасывается. Отметьте флажок и повторите: поле останется неверным даже с текстом.

Забытый сброс самая частая причина «непонятного» поведения: значение введено, а форма всё равно не отправляется.

Стиль required: :required, :optional, :invalid и :user-invalid

Для оформления есть четыре псевдокласса. Селектор :required находит обязательные поля, :optional необязательные. Селектор :invalid совпадает с неверным полем сразу после загрузки страницы, поэтому пустые обязательные поля загораются красным до первого ввода. Селектор :user-invalid срабатывает только после того, как посетитель поработал с полем.

CSS
label:has(+ input:required)::after {
  content: ' *';
  color: #a83f2e;
}

input:invalid {
  border-color: #a83f2e;
}

input:user-invalid {
  border-color: #a83f2e;
}
Результат

Первое поле красное сразу при загрузке. Второе остаётся нейтральным, пока вы не введёте и не сотрёте букву и не выйдете из поля. Звёздочки добавлены селектором label:has(+ input:required).

Не опирайтесь только на цвет и звёздочку: подсказку об обязательности нужно дать и текстом. Поля с readonly или disabled остаются :required, но как неверные не отмечаются. Подробнее о них рассказано на страницах readonly и disabled.

Как добавить и убрать required через JavaScript и jQuery

Сделать поле обязательным и снять обязательность скрипт может через свойство required: значение true включает, false выключает. Можно управлять и атрибутом: setAttribute('required', ''), removeAttribute('required') и toggleAttribute('required').

JavaScript
const input = document.querySelector('input');

input.required = true;   // сделать обязательным
input.required = false;  // снять

input.setAttribute('required', 'false'); // всё равно обязательно
input.required = 'false'; // непустая строка тоже даёт true
Результат

Нажимайте кнопки по очереди и следите за таблицей. Запись false в виде строки поле не отпускает, а убрать атрибут можно четвёртой кнопкой или присвоением false.

Если на сайте подключён jQuery, привычнее писать через его методы. Для булевых значений с версии 1.6 рекомендуют prop(), а attr() с значением 'false' ничего не отключит, как и в обычном JavaScript.

jQuery
$('#email').prop('required', true);   // сделать обязательным
$('#email').prop('required', false);  // снять

$('#email').attr('required', 'required'); // через атрибут
$('#email').removeAttr('required');       // убрать

Результат у обоих вариантов одинаковый. Без библиотеки достаточно одной строки: input.required = false.

Условный required: сделать поле обязательным по выбору посетителя

Часто поле должно быть обязательным не всегда, а только при определённом выборе: адрес нужен, если выбрана доставка. Для этого достаточно записать состояние флажка в свойство required поля.

HTML и JavaScript
<label><input type="checkbox" id="d"> Нужна доставка</label>
<input id="ad" name="ad">

<script>
d.addEventListener('change', () => {
  ad.required = d.checked;
});
</script>
Результат

Нажмите «Оформить» с пустым адресом: форма отправляется. Отметьте доставку и нажмите снова: форма остановилась, пока адрес пуст.

Такой подход удобнее, чем прописывать required в разметке для всех случаев: пустое необязательное поле не мешает отправке, а нужное становится обязательным в тот момент, когда это важно.

Required не защищает данные: проверка на сервере, ASP.NET Core и другие

Атрибут работает только в браузере посетителя. Любой человек может убрать required в инструментах разработчика, отправить форму с пустым полем или вообще отправить запрос без браузера. Для сервера такая форма неотличима от настоящей.

HTML и JavaScript
<form>
  <input name="city" required>
</form>

<script>
// то же самое делает посетитель в консоли
city.removeAttribute('required');
</script>
Результат

Нажмите «Отправить форму»: поле пустое, форма не отправилась. Нажмите первую кнопку и отправьте снова: на сервер уходит пустое значение.

Поэтому обязательность нужно проверять ещё и на сервере. В C# и ASP.NET Core для этого у свойства модели добавляют отдельный серверный атрибут [Required], а в других языках и фреймворках есть свои аналоги. HTML-атрибут required только подсказывает браузеру, а серверная проверка защищает данные.

Частые ошибки с атрибутом required

Почти все ошибки с required возникают от ожидания, что атрибут работает как значение true или false, либо что он надёжно защищает форму. В таблице собраны такие записи и то, к чему они приводят.

ЗаписьЧто получитсяКак правильно
required="false"Поле остаётся обязательнымУбрать атрибут целиком
<input type="range" required>, colorАтрибут не нужен: значение есть всегдаУбрать required
<button required>, <div required>Атрибута у этих тегов нетПрописывать required у полей формы
Radio без общего nameКнопки не образуют группу, проверка не работаетДать кнопкам один name
<select required><option>Выберите</option>Первый пункт считается выбранным, форма проходитЗаписать value="" первому пункту
Поле с пробеламиПробелы проходят проверкуОбрезать значение скриптом или использовать pattern
<input required readonly>, disabledПроверка required не срабатываетУбрать readonly или disabled
setCustomValidity(...) без сбросаПоле остаётся неверным после вводаСбрасывать пустой строкой при вводе
input.required = 'false'Непустая строка даёт trueinput.required = false
$('#a').attr('required', 'false')Поле остаётся обязательнымprop('required', false) или removeAttr('required')
input:invalid для всех пустых полейФорма краснеет до первого вводаinput:user-invalid
required как единственная защитаАтрибут снимается в инструментах разработчикаПроверять данные на сервере

Шпаргалка по атрибуту required

Когда нужно быстро вспомнить запись, ищите задачу в левом столбце. Правый столбец ведёт на отдельную страницу справочника.

Что нужноЧто прописатьТег
Обязательное текстовое поле<input required><input>
Обязательный флажок<input type="checkbox" required><input>
Обязательный список<select required><select>
Обязательное многострочное поле<textarea required><textarea>
Подсказка в списке<option value="">Выберите</option><option>
Включить и выключить из JSinput.required = true<input>
Выключить через jQuery$('#a').prop('required', false)<input>
Не проверять форму<form novalidate><form>
Стиль обязательных полейinput:required { ... }<input>
Свой текст ошибкиinput.setCustomValidity('...')<input>
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×