Тег datalist в HTML: что это, list и option

Тег datalist (от английского data list, «список данных») хранит варианты подсказок для поля ввода. Поле связывают со списком атрибутом list, а в самом datalist записывают теги option с вариантами. Сам элемент на странице не виден, подсказки показывает браузер при фокусе или вводе. Закрывающий </datalist> обязателен.

Для выбора только из заданных вариантов подходит тег тег select, а datalist лишь подсказывает: пользователь может ввести любое значение. Основы разобраны в уроке про связь datalist с полем, а поле создаёт тег input.

HTML
<input name="city" list="cities">
<datalist id="cities">
  <option value="Минск"></option>
  <option value="Киев"></option>
  <option value="Рига"></option>
</datalist>

Тег datalist в HTML: что это и для чего нужен

Поле со списком подсказок удобно, когда у ответа есть частые варианты, но допустимы и другие: город, марка, домен. У тега нет собственных атрибутов, только глобальные. Браузер открывает подсказки сам, а вид окна у разных браузеров свой. Вычисленный display у datalist равен none, поэтому на странице он не занимает места.

HTML
<input name="city" list="cities">
<datalist id="cities">
  <option value="Минск"></option>
</datalist>

Пример: поле без datalist и с ним

Результат

Выберите запись: под результатом связь поля со списком.

Связь datalist с полем: list и id

Связь задают два одинаковых значения: list у поля и id у datalist. Значения сравниваются с учётом регистра, поэтому list="Cities" не найдёт id="cities". Связь возможна только с datalist: у другого тега свойство input.list даёт null. Порядок в разметке не важен, список может находиться и до поля. При двух элементах с одним id берётся первый в документе, а проверка HTML сообщает об ошибке.

HTML
<datalist id="cities">
  <option value="Минск"></option>
</datalist>
<input list="cities">

Пример: когда связь есть и когда нет

Результат

Выберите запись: под результатом свойство list и первый вариант.

Варианты в datalist: option, value и label

Варианты задают с помощью тега option. Значение берётся из value, а без него из текста option. Атрибут label и текст служат пояснением, и как их показать вместе со значением, решает браузер. По спецификации подсказкой становится вариант без disabled и с непустым value, но свойство options считает все варианты подряд. Для пустого option с атрибутом value проверка HTML не сообщает об ошибке, а label="" считает ошибкой.

HTML
<datalist id="cities">
  <option value="RIX">Рига</option>
  <option value="TLL" label="Таллин"></option>
</datalist>

Пример: value, label и текст у option

Результат

Выберите запись: под результатом свойства первого option.

Какие поля работают с datalist: type и list

Список подключается к полям типов text, search, url, tel, email, number, range, color, date, month, week, time и datetime-local. У checkbox, radio, password, file, hidden и кнопок свойство input.list даёт null, а проверка HTML сообщает об ошибке. У range варианты рисуют деления на шкале: у option с disabled деления нет, а значение к делению не прилипает. Для color браузер может показать заданные цвета в окне выбора.

HTML
<input type="range" min="0" max="100" list="marks">
<datalist id="marks">
  <option value="0"></option>
  <option value="50"></option>
  <option value="100"></option>
</datalist>

Пример: у каких типов список подключается

Результат

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

Datalist лишь подсказывает: проверка и отправка

Список только подсказывает: поле принимает любое значение, которое проходит обычную проверку, даже если его нет среди вариантов. Сам браузер значение со списком не сравнивает. При проверке скриптом (includes) сравнение точное, регистр учитывается. В данные формы попадает значение поля, а сам datalist и его option не отправляются. Если нужен выбор строго из списка, используют тег select или проверяют значение скриптом.

HTML
<form>
  <input name="city" list="cities" required>
  <datalist id="cities">
    <option value="Киев"></option>
  </datalist>
</form>

Пример: значение из списка и вне списка

Результат

Выберите запись: под результатом проверка и данные формы.

Что записывают внутри datalist

Внутри datalist записывают теги option либо строчное содержимое. Текст рядом с option не виден и проверкой HTML не отмечается. Блочный div, hr и тег optgroup внутри проверка HTML считает ошибкой, а select пропускает. Свойство options считает такие варианты, даже когда они вложены в другой тег, но надёжнее записывать option прямыми дочерними элементами.

HTML
<datalist id="cities">
  Города
  <option value="Минск"></option>
</datalist>

Пример: что допустимо внутри datalist

Результат

Выберите запись: под результатом дети datalist и число вариантов.

Тег datalist и JavaScript: list и options

Свойство input.list возвращает datalist или null и доступно только для чтения: присваивание ничего не меняет. Чтобы связать поле с другим списком, меняют атрибут через setAttribute. Свойство options содержит все варианты, включая отключённые и с пустым value. Варианты наполняют из массива через replaceChildren и new Option, а список, заполненный один раз, работает у всех связанных полей.

JavaScript
const input = document.querySelector("input");
const cities = ["Минск", "Киев", "Рига"];
input.list.replaceChildren(
  ...cities.map(city => new Option(city))
);

Пример: list, options и наполнение

Результат

Выберите запись: под результатом ответ скрипта.

Тег datalist и CSS: что видно на странице

По умолчанию datalist скрыт: у него display: none и нулевые размеры. Если задать display: block, текст его option выводится строками на странице. Цвет, фон и шрифт тогда действуют только на этот блок, а окном подсказок управляет браузер, и оформить его почти нельзя. Если нужен свой вид списка, подсказки делают отдельным блоком с помощью JavaScript.

CSS
datalist {
  display: block;
}

Пример: datalist с display и без

Результат

Выберите запись: под результатом display и размер блока.

Доступность datalist: роль поля со списком

Поле со list получает роль combobox, а поле без списка остаётся textbox. Название задаёт обычный label, список его не заменяет. У полей number и range роли остаются spinbutton и slider. Окно подсказок рисует браузер, и поддержка в программах чтения может различаться, поэтому важные варианты дублируют в тексте рядом с полем. Роль role у самого datalist проверка HTML не допускает.

HTML
<label>Город
  <input name="city" list="cities">
</label>

Пример: роль поля со списком

Результат

Выберите запись: под результатом роль поля для программы чтения с экрана.

Атрибуты тега datalist

У datalist нет собственных атрибутов, только глобальные. Связь с полем задают id у списка и list у поля. Часть атрибутов знакома по другим тегам, но у datalist они не допускаются.

АтрибутСтатусЧто делаетПример записи
idглобальныйИдентификатор: значение указывают в list у поляid="cities"
classглобальныйКласс для оформления, если список выведен через displayclass="hint"
styleглобальныйВстроенные стилиstyle="display: block"
titleглобальныйВсплывающая подсказкаtitle="Города"
hiddenглобальныйСкрывает элемент, но у списка он и так скрытhidden
listне существуетПишется у поля, а не у datalistlist="cities"
nameне существуетСписок не отправляется, названия у него нетname="cities"
roleне допускаетсяРоль задаёт сам браузерrole="listbox"

Вопросы про тег datalist: общий список и проверка значения

Список подсказок удобно сделать общим для нескольких полей, а значение из него иногда проверяют вручную.

Можно ли использовать один datalist для нескольких полей?

Да. У полей записывают одинаковый list, и все они берут варианты из одного datalist. Вариант, добавленный в список один раз, появится у всех полей.

HTML
<input name="from" list="cities">
<input name="to" list="cities">
<datalist id="cities">
  <option value="Минск"></option>
</datalist>

Пример: два поля и один список

Результат

Выберите запись: под результатом список каждого поля.

Как проверить, что введённое значение есть в списке?

Берут значения всех вариантов через input.list.options и ищут среди них значение поля методом includes. Сравнение точное, поэтому «киев» и «Киев» считаются разными значениями.

JavaScript
const values = Array.from(input.list.options, o => o.value);
const found = values.includes(input.value);

Пример: поиск значения среди вариантов

Результат

Выберите запись: под результатом найдено ли значение.

Частые ошибки с тегом datalist

Ошибки с datalist чаще всего связаны с привязкой списка и ожиданиями от подсказок.

ОшибкаЧто происходитКак исправить
Разный регистр у list и idСвязи нет, input.list даёт nullЗаписать значения одинаково
list указывает не на datalistСвойство list даёт null, проверка HTML сообщает об ошибкеЗаписать id у самого datalist
Два datalist с одним idБерётся первый, проверка HTML сообщает об ошибкеСделать id уникальными
Расчёт на то, что datalist запретит другие значенияЛюбое значение проходит проверку, список лишь подсказываетИспользовать select или проверку скриптом
list у checkbox, password или fileСписок не подключается, проверка HTML сообщает об ошибкеВыбрать тип, с которым список подключается
div, hr или optgroup внутриПроверка HTML сообщает об ошибкеЗаписывать option прямыми дочерними элементами
name, role или list у datalistАтрибуты не допускаются, проверка HTML сообщает об ошибкеУбрать, а list писать у поля
Пустой value или disabled у вариантаПо спецификации такой вариант подсказкой не станетЗадать непустой value и убрать disabled
Ждать, что CSS оформит окно подсказокОкном управляет браузер, стили действуют только на блок при display: blockСделать свой список подсказок скриптом
Категория
Поделиться в социальных сетях

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

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

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

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

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