Зверніть увагу, що datalistце не те саме, що a 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звичайний та прихований ввід потрібні сценарію, щоб знати, який вхід належить до якої прихованої версії. Таким чином, можна мати декілька inputs на одній сторінці з одним або декількома datalists, що пропонують пропозиції.
Будь-яке введення користувача подається як є. Щоб подати порожнє значення, коли введення даних користувача відсутнє в даталісті, змініть hiddenInput.value = inputValueнаhiddenInput.value = ""
Робочі приклади jsFiddle: звичайний javascript та jQuery
value=""має перевагу над рядком у тегах, коли б там не булоvalue=""оголошено. Тож пропозицією було б зробити «відповідь» вашим атрибутом значення.