Обратите внимание, что 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, при этом один или несколько datalist
s предоставляют предложения.
Любой пользовательский ввод предоставляется как есть. Чтобы отправить пустое значение, когда пользовательский ввод отсутствует в списке данных, измените hiddenInput.value = inputValue
наhiddenInput.value = ""
Рабочие примеры jsFiddle: простой javascript и jQuery
value=""
должен иметь приоритет над строкой в тегах, когдаvalue=""
объявлено. Таким образом, предлагается сделать «ответ» вашим атрибутом значения.