Nota che datalist
non è la stessa cosa di un file select
. Consente agli utenti di inserire un valore personalizzato che non è nell'elenco e sarebbe impossibile recuperare un valore alternativo per tale input senza prima definirlo.
I modi possibili per gestire l'input dell'utente sono inviare il valore immesso così com'è, inviare un valore vuoto o impedire l'invio. Questa risposta gestisce solo le prime due opzioni.
Se vuoi disabilitare completamente l'input dell'utente, forse select
sarebbe una scelta migliore.
Per mostrare solo il valore del testo option
nel menu a discesa, utilizziamo il testo interno e tralascia l' value
attributo. Il valore effettivo che vogliamo inviare è memorizzato in un data-value
attributo personalizzato :
Per inviare questo data-value
dobbiamo utilizzare un file <input type="hidden">
. In questo caso tralasciamo l' name="answer"
input normale e lo spostiamo nella copia nascosta.
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
In questo modo, quando il testo nell'input originale cambia, possiamo usare javascript per controllare se il testo è presente anche nel file datalist
e recuperarlo data-value
. Quel valore viene inserito nell'input nascosto e inviato.
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;
}
}
});
L'id answer
e answer-hidden
l'input normale e nascosto sono necessari affinché lo script sappia quale input appartiene a quale versione nascosta. In questo modo è possibile avere più messaggi input
sulla stessa pagina con uno o più messaggi datalist
che forniscono suggerimenti.
Qualsiasi input dell'utente viene inviato così com'è. Per inviare un valore vuoto quando l'input dell'utente non è presente nella lista dati, passare hiddenInput.value = inputValue
ahiddenInput.value = ""
Esempi di jsFiddle funzionanti: javascript e jQuery semplici
value=""
dovrebbe avere la precedenza su una stringa all'interno dei tag, ogni volta che è presente un filevalue=""
dichiarato. Quindi il suggerimento sarebbe quello di rendere "la risposta" il tuo attributo di valore.