Beachten Sie, dass dies datalist
nicht dasselbe ist wie a select
. Benutzer können einen benutzerdefinierten Wert eingeben, der nicht in der Liste enthalten ist, und es ist unmöglich, einen alternativen Wert für eine solche Eingabe abzurufen, ohne ihn zuerst zu definieren.
Mögliche Möglichkeiten zur Verarbeitung von Benutzereingaben bestehen darin, den eingegebenen Wert unverändert zu übermitteln, einen leeren Wert zu übermitteln oder das Übermitteln zu verhindern. Diese Antwort behandelt nur die ersten beiden Optionen.
Wenn Sie Benutzereingaben vollständig verbieten möchten, ist dies möglicherweise select
die bessere Wahl.
Um nur den option
Textwert von in der Dropdown-Liste anzuzeigen, verwenden wir den inneren Text dafür und lassen das value
Attribut weg . Der tatsächliche Wert, den wir senden möchten, wird in einem benutzerdefinierten data-value
Attribut gespeichert :
Um dies einzureichen, müssen data-value
wir eine verwenden <input type="hidden">
. In diesem Fall lassen wir name="answer"
die reguläre Eingabe weg und verschieben sie in die versteckte Kopie.
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
Auf diese Weise können wir, wenn sich der Text in der ursprünglichen Eingabe ändert, mit Javascript prüfen, ob der Text auch in der vorhanden ist, datalist
und ihn abrufendata-value
. Dieser Wert wird in die versteckte Eingabe eingefügt und gesendet.
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;
}
}
});
Die ID answer
sowie answer-hidden
die reguläre und versteckte Eingabe werden benötigt, damit das Skript weiß, welche Eingabe zu welcher versteckten Version gehört. Auf diese Weise ist es möglich, mehrere input
s mit einem oder mehreren auf derselben Seite zu habendatalist
s Vorschläge liefern.
Alle Benutzereingaben werden unverändert übermittelt. Um einen leeren Wert zu senden, wenn die Benutzereingabe nicht in der Datenliste vorhanden ist, ändern Sie hiddenInput.value = inputValue
zuhiddenInput.value = ""
Arbeitsbeispiele für jsFiddle: einfaches Javascript und jQuery
value=""
Vorrang vor einer Zeichenfolge innerhalb der Tags übernehmen sollte, wann immer es eine istvalue=""
erklärt. Der Vorschlag wäre also, "die Antwort" zu Ihrem Wertattribut zu machen.