Как отобразить label, но отправить value в HTML5 <datalist>

Пройдите тест, узнайте какой профессии подходите
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы пользователь видел пользовательские подписи, а на сервер отправлялись реальные значения, воспользуйтесь атрибутами label и value. Атрибут label отвечает за отображение текста, а value — за значения, которые пересылаются на сервер. Данные атрибуты нужно указывать в элементах <option>, располагаемых внутри <datalist>. В пользовательском интерфейсе будет видно значение label, а при отправке формы будет передаваться значение value.

HTML
Скопировать код
<input list="items" name="item">
<datalist id="items">
  <option value="12345" label="Виджет A"></option>
  <option value="67890" label="Виджет B"></option>
</datalist>

Таким образом, при выборе "Виджет A" или "Виджет B" на сервер отправляются значения "12345" или "67890" соответственно.

Пошаговый план для смены профессии

Детальное разъяснение

Использование JavaScript для присвоения значений

Если вы хотите преобразовать выбранное пользователем значение в реальное перед отправкой на сервер, то вам поможет JavaScript. Он позволит обновить значение скрытого поля так, чтобы оно соответствовало атрибуту data-value выбранного элемента.

HTML
Скопировать код
<input list="items" id="inputField" name="itemLabel" oninput="getValue()"> 
<input type="hidden" id="hiddenField" name="item">
<datalist id="items">
  <option value="Виджет A" data-value="12345"></option>
  <option value="Виджет B" data-value="67890"></option>
</datalist>

И добавим немного JavaScript:

JS
Скопировать код
function getValue() {
    var input = document.getElementById('inputField');
    var hiddenInput = document.getElementById('hiddenField');
    
    var chosenValue = input.value;
    var optionsList = document.getElementById('items').childNodes;
    
    for(var i = 0; i < optionsList.length; i++) {
        if(optionsList[i].value === chosenValue) {
            hiddenInput.value = optionsList[i].getAttribute('data-value');
            break;
        }
    }
}

Выбор языка программирования: JavaScript или jQuery

Такие задачи можно решить и с помощью чистого JavaScript, и с помощью jQuery. Вот пример на jQuery:

JS
Скопировать код
$('#inputField').on('input', function() {
    var chosenValue = $(this).val();
    var hiddenValue = $('#items option').filter(function() {
        return this.value === chosenValue;
    }).data('value');
    $('#hiddenField').val(hiddenValue || chosenValue);
});

Селекторы jQuery быстро находят значения опций, а метод .data() используется для доступа к данным атрибутам.

Неуникальные подписи: Что делать?

Если подписи уникальными сделать не получается, но вам всё же нужно отправить правильное значение, JavaScript сможет выполнить это, корректно связав пользовательский ввод с элементами в <datalist>.

Визуализация

Следует наглядно продемонстрировать изученный материал:

Видимое пользователем (подпись)🍔 Бургер🍟 Картофель Фри🥤 Газировка
Передаваемое значение (value)burger001fries002soda003

Вы видите 🍔 (Бургер), а сервер получает "burger001".

Универсальный опыт

Готовность к разным браузерам

Не забывайте проверять своё решение в различных браузерах: дружественном Chrome, непредсказуемом Firefox, лояльном Opera или капризном Internet Explorer.

Альтернативы для неполной поддержки datalist

Если браузер не поддерживает <datalist> в полном объёме, можно использовать <select> с возможностью поиска как запасной вариант:

HTML
Скопировать код
<select id="itemsFallback" name="item">
  <option value="12345">Виджет A</option>
  <option value="67890">Виджет B</option>
</select>

Советы для начинающих

Повышение интерактивности

Для улучшения удобства пользователя устанавливайте отображение списка выбора при фокусировке на поле ввода:

JS
Скопировать код
document.getElementById('inputField').addEventListener('focus', (event) => {
    event.target.setAttribute('list', 'items');
});

Полезные материалы

  1. HTML datalist Tag — документация и примеры использования тега <datalist>.
  2. FormData – Web APIs | MDN — работа с данными формы на JavaScript.
  3. Constraint validation – HTML: HyperText Markup Language | MDN — внедрение проверки данных формы в HTML5.
  4. HTML Input Types — обзор типов ввода в HTML.
  5. Using data attributes – Learn web development | MDN — использование данных атрибутов в HTML.
  6. JavaScript Events — управление событиями на JavaScript.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой атрибут отвечает за отображение текста в элементе <datalist>?
1 / 5