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