Beachten Sie, dass dies datalistnicht 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 selectdie bessere Wahl.
Um nur den optionTextwert von in der Dropdown-Liste anzuzeigen, verwenden wir den inneren Text dafür und lassen das valueAttribut weg . Der tatsächliche Wert, den wir senden möchten, wird in einem benutzerdefinierten data-valueAttribut gespeichert :
Um dies einzureichen, müssen data-valuewir 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, datalistund 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-hiddendie 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 inputs 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 = inputValuezuhiddenInput.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.