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 select
byłby lepszym wyborem.
Aby wyświetlić tylko wartość tekstową option
w menu rozwijanym, używamy do tego tekstu wewnętrznego i pomijamy value
atrybut. Rzeczywista wartość, którą chcemy przesłać, jest przechowywana w niestandardowym data-value
atrybucie:
Aby to przesłać, data-value
musimy 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 datalist
i 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 answer
oraz answer-hidden
zwykł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 input
adresów na tej samej stronie, przy czym jeden lub więcej datalist
zawiera 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 = inputValue
nahiddenInput.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.