Zwróć na to uwagę datalist to nie to samo, co plik select. Pozwala użytkownikom wprowadzić niestandardową wartość, której nie ma na liście, i niemożliwe byłoby pobranie alternatywnej wartości dla takich danych wejściowych bez uprzedniego zdefiniowania jej.
Możliwe sposoby obsługi danych wejściowych użytkownika to przesłanie wprowadzonej wartości tak, jak jest, przesłanie pustej wartości lub zapobieżenie przesłaniu. Ta odpowiedź dotyczy tylko dwóch pierwszych opcji.
Jeśli chcesz całkowicie zabronić wprowadzania danych przez użytkownika, być może selectbyłby lepszym wyborem.
Aby wyświetlić tylko wartość tekstową optionw menu rozwijanym, używamy do tego tekstu wewnętrznego i pomijamy valueatrybut. Rzeczywista wartość, którą chcemy przesłać, jest przechowywana w niestandardowym data-valueatrybucie:
Aby to przesłać, data-valuemusimy użyć pliku <input type="hidden">. W tym przypadku pomijamy name="answer"zwykłe wejście i przenosimy je do ukrytej kopii.
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
W ten sposób, gdy tekst w oryginalnym wejściu zmieni się, możemy użyć javascript, aby sprawdzić, czy tekst również występuje w pliku datalisti pobrać jego data-value. Ta wartość jest wstawiana do ukrytych danych wejściowych i przesyłana.
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;
}
}
});
Identyfikator answeroraz answer-hiddenzwykłe i ukryte dane wejściowe są potrzebne, aby skrypt wiedział, które wejście należy do której ukrytej wersji. W ten sposób możliwe jest umieszczenie wielu inputadresów na tej samej stronie, przy czym jeden lub więcej datalistzawiera sugestie.
Wszelkie dane wejściowe użytkownika są przesyłane bez zmian. Aby przesłać pustą wartość, gdy dane wejściowe użytkownika nie są obecne w danych, zmień hiddenInput.value = inputValuenahiddenInput.value = ""
Działające przykłady jsFiddle: zwykły javascript i jQuery
value=""powinno mieć pierwszeństwo przed ciągiem znaków w tagach, gdy tylko jestvalue=""zadeklarowane. Zatem sugestią byłoby uczynienie „odpowiedzi” swoim atrybutem wartości.