541 Stimmen

Wie kann ich Formulardaten mit JavaScript/jQuery abrufen?

Gibt es einen einfachen, einzeiligen Weg, um die Daten eines Formulars zu erhalten, wie es wäre, wenn es auf die klassische HTML-only Weise übermittelt würde?

Zum Beispiel:

        Hi
        Ho

Ausgabe:

{
    "foo": "1",
    "bar": "xxx",
    "this": "hi"
}

So etwas ist zu einfach, da es (korrekterweise) keine Textareas, Selects, Radio-Buttons und Checkboxes enthält:

$("#form input").each(function () {
    data[theFieldName] = theFieldValue;
});

3 Stimmen

Eine weitere Frage ähnlich zu dieser: stackoverflow.com/questions/169506/…

635voto

Boycott Russia Punkte 11472

Verwenden Sie $('form').serializeArray(), das ein Array zurückgibt:

[
  {"name":"foo","value":"1"},
  {"name":"bar","value":"xxx"},
  {"name":"this","value":"hi"}
]

Eine andere Option ist $('form').serialize(), das einen String zurückgibt:

"foo=1&bar=xxx&this=hi"

Schauen Sie sich dieses jsfiddle-Demo unter diesem Link an

126 Stimmen

serializeArray wäre so viel nützlicher, wenn es ein Objekt mit Schlüssel-Wert-Paaren zurückgeben würde.

14 Stimmen

Ich stimme zu, dass ein Objekt ideal wäre. Allerdings gibt es ein Problem - ein Schlüssel darf mehrere Werte haben. Würdest du ein Schlüssel-"Array von Werten"-Objekt zurückgeben, oder den Schlüssel-"ersten Wert" oder etwas anderes? Ich glaube, die jQuery-Leute haben keines davon gewählt :)

2 Stimmen

Beachten Sie ein Problem mit mehreren Werten (wie @Paul oben erwähnt hat), Kontrollkästchen und mehrere Eingaben mit name="multiple[]" funktionieren nicht. Die Lösung für die POST-Methode ist dieselbe, verwenden Sie einfach $('form').serialize(). Auch die POST-Methode hat keine Begrenzung von 2000 Zeichen wie GET in den meisten Browsern, daher kann sie auch für recht große Daten verwendet werden.

519voto

chelmertz Punkte 19842
$('form').serialize() //das erzeugt: "foo=1&bar=xxx&this=hi"

demo

23 Stimmen

Schließen Sie, aber vielleicht etwas, das ein Array mit Schlüssel-Wert-Paaren zurückgibt, anstatt nur eine Zeichenfolge?

93 Stimmen

Nvm, ich habe es in den Kommentaren zur serialize() Funktion gefunden. Es heißt serializeArray. Es gibt ein Array von Arrays zurück (die einen Eintrag "name" und "value" enthalten), aber das sollte einfach genug zu transformieren sein.

28 Stimmen

Und mit der Verwendung der Underscore-Bibliothek kann dies transformiert werden mit: _.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))

330voto

mikemaccana Punkte 93077

Aktualisierte Antwort für 2014: HTML5 FormData macht das

var formData = new FormData(document.querySelector('form'))

Dann können Sie formData genau so posten, wie es ist - es enthält alle Namen und Werte, die im Formular verwendet werden.

Hinweis: FormData-Objekte zeigen nichts an, wenn Sie sie loggen, was ärgerlich ist! Um FormData zu loggen, verwenden Sie console.log(formData.entries())

21 Stimmen

Plus eins, da FormData gut und nützlich ist, aber es lohnt sich zu beachten, dass es nicht so einfach ist, die Daten innerhalb von FormData zu LESEN (siehe stackoverflow.com/questions/7752188/…)

4 Stimmen

@StackExchangeWhatTheHeck Was meinst du? formData.get('something')

4 Stimmen

@brad Dieser Kommentar stammt von vor acht Jahren. .get() existierte damals noch nicht.

259voto

neuront Punkte 8774

Auf der Grundlage von jQuery.serializeArray gibt key-value Paare zurück.

var data = $('#form').serializeArray().reduce(function(obj, item) {
    obj[item.name] = item.value;
    return obj;
}, {});

25 Stimmen

Key-Wert-Paare hier, Leute, jeder, kommt her! Es ist golden!!! Danke! Wenn ich den Wert eines Elements mit dem Namen "Händler" haben möchte, tue ich dies console.log($('#form').serializeArray().reduce(function(obj, item) { obj[item.name] = item.value; return obj;}, {} )['retailer']);

121voto

Brad Punkte 151817
document.querySelector('form').addEventListener('submit', (e) => {
  const formData = new FormData(e.target);
  // Jetzt kannst du formData.get('foo') verwenden, zum Beispiel.
  // Vergiss nicht e.preventDefault(), wenn du das normale Formularverhalten stoppen möchtest.
});

Dies ist eine kleinliche Antwort, aber lass mich erklären, warum dies eine bessere Lösung ist:

  • Wir behandeln das Absenden eines Formulars korrekt und nicht einfach das Drücken einer Schaltfläche. Einige Leute drücken gerne die Eingabetaste auf Feldern. Einige Leute verwenden alternative Eingabegeräte wie Spracheingabe oder andere Hilfsmittel für die Barrierefreiheit. Bearbeiten Sie das Formularabsenden und lösen Sie es für alle korrekt.

  • Wir greifen auf die Formulardaten des tatsächlich übermittelten Formulars zu. Wenn Sie später Ihren Formular-Selektor ändern, müssen Sie die Selektoren für alle Felder nicht ändern. Außerdem haben Sie möglicherweise mehrere Formulare mit denselben Eingabefeldnamen. Es ist nicht erforderlich, mit übermäßigen IDs und dergleichen eine Unterscheidung vorzunehmen, verfolgen Sie die Eingabefelder einfach basierend auf dem übermittelten Formular. Dies ermöglicht es Ihnen auch, einen einzelnen Ereignishandler für mehrere Formulare zu verwenden, wenn dies für Ihre Situation angemessen ist.

  • Die FormData-Schnittstelle ist relativ neu, jedoch von Browsern gut unterstützt. Es ist eine großartige Möglichkeit, diese Datensammlung aufzubauen, um die tatsächlichen Werte dessen zu erhalten, was sich im Formular befindet. Ohne sie müssen Sie alle Elemente durchlaufen (zum Beispiel mit form.elements) und herausfinden, was ausgewählt ist, was nicht, was die Werte sind, usw. Es ist durchaus möglich, wenn Sie Unterstützung für alte Browser benötigen, aber die FormData-Schnittstelle ist einfacher.

  • Ich benutze hier ES6... keineswegs eine Anforderung, also ändern Sie es zurück, um ES5-kompatibel zu sein, wenn Sie Unterstützung für alte Browser benötigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X