Обратите внимание, что datalistэто не то же самое, что select. Он позволяет пользователям вводить пользовательское значение, которого нет в списке, и было бы невозможно получить альтернативное значение для такого ввода, не определив его предварительно.
Возможные способы обработки пользовательского ввода: отправить введенное значение как есть, отправить пустое значение или запретить отправку. Этот ответ обрабатывает только первые два варианта.
Если вы хотите полностью запретить ввод данных пользователем, возможно, selectэто будет лучшим выбором.
Чтобы отобразить только текстовое значение optionв раскрывающемся списке, мы используем для него внутренний текст и опускаем valueатрибут. Фактическое значение, которое мы хотим отправить, хранится в настраиваемом data-valueатрибуте:
Чтобы отправить это, data-valueмы должны использовать <input type="hidden">. В этом случае мы не указываем name="answer"на обычном входе и перемещаем его в скрытую копию.
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
Таким образом, когда текст в исходном вводе изменяется, мы можем использовать javascript, чтобы проверить, присутствует ли текст в datalistфайле, и получить его data-value. Это значение вставляется в скрытый ввод и отправляется.
document.querySelector('input[list]').addEventListener('input', function(e) {
var input = e.target,
list = input.getAttribute('list'),
options = document.querySelectorAll('#' + list + ' option'),
hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden'),
inputValue = input.value;
hiddenInput.value = inputValue;
for(var i = 0; i < options.length; i++) {
var option = options[i];
if(option.innerText === inputValue) {
hiddenInput.value = option.getAttribute('data-value');
break;
}
}
});
Идентификатор answerи answer-hiddenна обычном и скрытом вводе необходимы для того, чтобы скрипт знал, какой ввод принадлежит какой скрытой версии. Таким образом, inputна одной странице может быть несколько s, при этом один или несколько datalists предоставляют предложения.
Любой пользовательский ввод предоставляется как есть. Чтобы отправить пустое значение, когда пользовательский ввод отсутствует в списке данных, измените hiddenInput.value = inputValueнаhiddenInput.value = ""
Рабочие примеры jsFiddle: простой javascript и jQuery
value=""должен иметь приоритет над строкой в тегах, когдаvalue=""объявлено. Таким образом, предлагается сделать «ответ» вашим атрибутом значения.