Derzeit ist der HTML5 <datalist>
Element in den meisten gängigen Browsern (außer Safari) unterstützt und scheint eine interessante Möglichkeit zu sein, einer Eingabe Vorschläge hinzuzufügen.
Es scheint jedoch einige Diskrepanzen zwischen der Implementierung des value
Attributs und dem inneren Text auf dem zu geben <option>
. Beispielsweise:
<input list="answers" name="answer">
<datalist id="answers">
<option value="42">The answer</option>
</datalist>
Dies wird von verschiedenen Browsern unterschiedlich gehandhabt:
Chrome und Opera:
FireFox und IE 11:
Nach Auswahl eines wird die Eingabe mit dem Wert und nicht mit dem inneren Text gefüllt. Ich möchte nur, dass der Benutzer den Text ("Die Antwort") in der Dropdown-Liste und in der Eingabe sieht, aber den Wert beim Senden übergibt 42
, wie zselect
würde.
Wie kann ich dafür sorgen, dass alle Browser in der Dropdown-Liste die Beschriftungen (inneren Text) des <option>
s anzeigen , aber das value
Attribut senden , wenn das Formular gesendet wird?
quelle
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.Antworten:
Beachten Sie, dass dies
datalist
nicht dasselbe ist wie aselect
. 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 dasvalue
Attribut weg . Der tatsächliche Wert, den wir senden möchten, wird in einem benutzerdefiniertendata-value
Attribut gespeichert :Um dies einzureichen, müssen
data-value
wir eine verwenden<input type="hidden">
. In diesem Fall lassen wirname="answer"
die reguläre Eingabe weg und verschieben sie in die versteckte Kopie.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.Die ID
answer
sowieanswer-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, mehrereinput
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
quelle
Die Lösung, die ich benutze, ist die folgende:
Greifen Sie dann mit JavaScript wie folgt auf den Wert zu, der an den Server gesendet werden soll:
Ich hoffe es hilft.
quelle
input
Element mit Attribut aktualisiertdata-value="1"
. Dann schrieb ich den folgenden Block an die Stellen, an denen der Wertif (typeof $(this).attr('data-value') != 'undefined') { var id = $(this).attr('name'); val = $('#'+id).find('option[value="'+val+'"]').attr('data-value'); }
Mir ist klar, dass dies etwas spät sein kann, aber ich bin darauf gestoßen und habe mich gefragt, wie ich mit Situationen mit mehreren identischen Werten, aber unterschiedlichen Schlüsseln umgehen soll (gemäß Bigbearzhus Kommentar).
Also habe ich Stephan Mullers Antwort leicht modifiziert:
Ein Datalist mit nicht eindeutigen Werten:
Wenn der Benutzer eine Option, der Browser ersetzt
input.value
mit dervalue
derdatalist
Option statt derinnerText
.Der folgende Code sucht dann nach einem
option
damitvalue
, schiebt das in das versteckte Feld und ersetzt dasinput.value
durch dasinnerText
.Infolgedessen sieht der Benutzer, was auch immer die Option
innerText
sagt, aber die eindeutige ID vonoption.value
ist beim Senden des Formulars verfügbar. Demo jsFiddlequelle
Wenn Sie auf die Schaltfläche für die Suche klicken, können Sie sie ohne Schleife finden.
Fügen Sie der Option einfach ein Attribut mit dem Wert hinzu, den Sie benötigen (wie
id
), und suchen Sie danach.quelle
Mit PHP habe ich einen recht einfachen Weg gefunden, dies zu tun. Leute, benutzt einfach so etwas
Mit dem obigen Code kann das Formular die ID der ebenfalls ausgewählten Option tragen.
quelle
customer_id_real
Übermittlung erhalten, nicht den ausgewählten Wert.