Wie konvertiere ich alle Elemente meines Formulars in ein JavaScript-Objekt?
Ich möchte eine Möglichkeit haben, automatisch ein JavaScript-Objekt aus meinem Formular zu erstellen, ohne jedes Element durchlaufen zu müssen. Ich möchte weder eine Zeichenfolge, wie von zurückgegeben $('#formid').serialize();
, noch möchte ich, dass die Karte von zurückgegeben wird$('#formid').serializeArray();
javascript
jquery
json
serialization
Yisroel
quelle
quelle
Antworten:
serializeArray
macht schon genau das. Sie müssen nur die Daten in das gewünschte Format einmassieren:Achten Sie auf versteckte Felder, die denselben Namen wie echte Eingaben haben, da diese überschrieben werden.
quelle
$.map( $("#container :input"), function(n, i) { /* n.name and $(n).val() */ } );
wenn Sie deaktivierte Elemente einschließen müssen.foo[bar]
Eingaben vom Typ "Typ" nicht wie erwartet verarbeitet, ganz zu schweigen von den meisten anderen Arten von Eingabenamen. Nachdem ich mit flachen Lösungen für dieses Problem sehr frustriert war, schrieb ich mein eigenes jQuery-Plugin - Details in der Antwort, die ich auf diese Frage gegeben habe.Konvertieren Sie Formulare wie ein Chef in JSON
Die aktuelle Quelle ist auf GitHub und Bower .
Der folgende Code ist jetzt veraltet .
Der folgende Code kann mit allen Arten von Eingabenamen arbeiten. und behandeln Sie sie so, wie Sie es erwarten würden.
Zum Beispiel:
Verwendungszweck
Die Zauberei (JavaScript)
quelle
<select name="foo" multiple="multiple">
funktioniert in keinem Szenario. Wenn Sie jedoch[]
wie in verwenden<select name="bar[]" multiple="multiple">
, wird es gut funktionieren :)Was ist falsch mit:
quelle
.each
statt.map
?var form = {}; $.each($(this).serializeArray(), function (i, field) { form[field.name] = field.value || ""; });
$(this).serializeArray().reduce(function(m,o){ m[o.name] = o.value; return m;}, {})
Eine feste Version von Tobias Cohens Lösung. Dieser behandelt korrekte Werte wie
0
und korrekt''
.Und eine CoffeeScript-Version für Ihre Codierungskomfort:
quelle
value = @value ? ''
keyMap
und die folgende Zeile hinzugefügt :key = if keyMap? then keyMap(@name) else @name
. Jetzt können Sie Mapping-Funktion wie übergeben(name) -> name.match(/\[([^\]]+)]/)[1]
. Und dann müsste man alle nachfolgenden Änderungen@name
zukey
, natürlichpost
, könntest du es einfach tun$('form').serializeObject().post
. Keine ausgefallene Zuordnung erforderlich.if (!objectData[this.name].push)
??objectData[this.name]
die Push-Methode vorhanden ist (ungefähr handelt es sich um ein Array). Wenn es sich um ein Array handelt, wird der Wert verschoben. Wenn es sich nicht um ein Array handelt, wird es in ein Array konvertiert, sodass mehrere Werte mit demselben Schlüssel zu einem Array kombiniert werden.Ich benutze
Array.prototype.reduce
es gerne, weil es ein Einzeiler ist und sich nicht auf Underscore.js oder ähnliches stützt :Dies ähnelt der Antwort mit
Array.prototype.map
, aber Sie müssen Ihren Bereich nicht mit einer zusätzlichen Objektvariablen überladen. One-Stop-Shopping.WICHTIGER HINWEIS : Formulare mit Eingaben mit doppelten
name
Attributen sind gültiges HTML und ein allgemeiner Ansatz. Die Verwendung einer der Antworten in diesem Thread ist in diesem Fall unangemessen (da Objektschlüssel eindeutig sein müssen).quelle
array.prototype.reduce()
dies in IE8 nicht verfügbar ist, da es Teil der ECMAScript 5-Spezifikation ist. Wenn Sie also IE8-Unterstützung benötigen, sollten Sie eine Polyfüllung oder eine andere Lösung verwenden.Alle diese Antworten schienen mir so übertrieben. Der Einfachheit halber gibt es etwas zu sagen. Solange für alle Formulareingaben das Attribut name festgelegt ist, sollte dies nur mit Jim Dandy funktionieren.
quelle
Es gibt wirklich keine Möglichkeit, dies zu tun, ohne jedes der Elemente zu untersuchen. Was Sie wirklich wissen möchten, ist: "Hat jemand anderes bereits eine Methode geschrieben, die ein Formular in ein JSON-Objekt konvertiert?" So etwas wie das Folgende sollte funktionieren - beachten Sie, dass Sie nur die Formularelemente erhalten, die über einen POST zurückgegeben werden (müssen einen Namen haben). Dies wird nicht getestet .
quelle
Wenn Sie Underscore.js verwenden , können Sie Folgendes verwenden:
quelle
Ich habe überprüft, ob bei allen anderen Antworten ein Problem vorliegt. Wenn der Eingabename ein Array ist, z. B.
name[key]
, sollte er wie folgt generiert werden:name:{ key : value }
Beispiel: Wenn Sie ein HTML-Formular haben, das dem folgenden ähnlich ist:
Es sollte jedoch genau wie der folgende JSON generiert werden und wird nicht zu einem Objekt wie dem folgenden mit allen anderen Antworten. Wenn also jemand so etwas wie den folgenden JSON mitbringen möchte, probieren Sie den folgenden JS-Code aus.
quelle
eval
es nicht auf diese Weise verwendet werden sollte, weileval
es auf diese Weise furchtbar unzuverlässige, fehlerhafte, schlecht funktionierende und möglicherweise unsichere Praktiken fördert.this.c = function(k,v){ eval("c = typeof "+k+";"); if(c == 'undefined') _t.b(k,v);}
ist kurz und nicht erklärend. Ein Entwickler mit weniger Erfahrung kopiert dies einfach, ohne zu verstehen, warum und wie es funktioniert.eval()
aus meinem Code entfernt habe.Ok, ich weiß, dass dies bereits eine sehr positive Antwort hat, aber kürzlich wurde eine ähnliche Frage gestellt , und ich wurde auch auf diese Frage verwiesen . Ich möchte meine Lösung auch anbieten, da sie einen Vorteil gegenüber der akzeptierten Lösung bietet: Sie können deaktivierte Formularelemente einfügen (was manchmal wichtig ist, abhängig davon, wie Ihre Benutzeroberfläche funktioniert).
Hier ist meine Antwort von der anderen SO-Frage :
Ursprünglich verwendeten wir die
serializeArray()
Methode von jQuery , die jedoch keine deaktivierten Formularelemente enthält. Wir deaktivieren häufig Formularelemente, die mit anderen Quellen auf der Seite "synchronisiert" werden, müssen die Daten jedoch weiterhin in unser serialisiertes Objekt aufnehmen. AlsoserializeArray()
ist raus. Wir haben den:input
Selektor verwendet, um alle Eingabeelemente (sowohl aktiviert als auch deaktiviert) in einem bestimmten Container abzurufen und dann$.map()
unser Objekt zu erstellen.Beachten Sie, dass jede Ihrer Eingaben ein
name
Attribut benötigt, das der Name der Eigenschaft des resultierenden Objekts ist.Das ist tatsächlich etwas modifiziert von dem, was wir verwendet haben. Wir mussten ein Objekt erstellen, das als .NET IDictionary strukturiert war, also haben wir Folgendes verwendet: (Ich stelle es hier zur Verfügung, falls es nützlich ist)
Ich mag diese beiden Lösungen, weil sie eine einfache Verwendung der
$.map()
Funktion sind und Sie die vollständige Kontrolle über Ihren Selektor haben (also welche Elemente Sie letztendlich in Ihr resultierendes Objekt aufnehmen). Außerdem ist kein zusätzliches Plugin erforderlich. Einfache alte jQuery.quelle
map
diese Weise ein Array von Objekten mit einer einzigen Eigenschaft erstellen, werden nicht alle Eigenschaften zu einem Objekt zusammengefasst.Diese Funktion sollte mehrdimensionale Arrays zusammen mit mehreren Elementen mit demselben Namen verarbeiten.
Ich benutze es bisher seit ein paar Jahren:
quelle
Du kannst das:
Siehe JSON .
quelle
Einzeiler (keine anderen Abhängigkeiten als jQuery) verwendet eine feste Objektbindung für die an die
map
Methode übergebene Funktion .Was es macht?
Geeignet für progressive Web-Apps (man kann sowohl reguläre Formularübermittlungsaktionen als auch Ajax-Anfragen problemlos unterstützen)
quelle
Verwenden:
Ausgabe:
quelle
Einfachheit ist hier am besten. Ich habe einen einfachen String-Ersatz durch einen regulären Ausdruck verwendet, und sie haben bisher wie ein Zauber funktioniert. Ich bin kein Experte für reguläre Ausdrücke, aber ich wette, Sie können sogar sehr komplexe Objekte füllen.
quelle
Aus einer älteren Antwort:
quelle
serializeArray
sodass Sie die Freiheit haben, die gewünschten Eingaben zu wählen (z. B. können Sie deaktivierte Eingaben einschließen), oder? Dh das ist nicht an irgendein Formular oder das Submit-Ereignis gekoppelt, es ist nur für sich unabhängig?reduce
das Objekt zurückgegeben wird. Dies ist nicht unabhängig, datoArray
es von jQuery stammt.Ich habe ein Problem mit Tobias Cohens Code gefunden (ich habe nicht genug Punkte, um ihn direkt zu kommentieren), das ansonsten für mich funktioniert. Wenn Sie zwei Auswahloptionen mit demselben Namen haben, beide mit dem Wert = "", erzeugt der ursprüngliche Code "name": "" anstelle von "name": ["", ""]
Ich denke, dies kann behoben werden, indem "|| o [this.name] == ''" zur ersten if-Bedingung hinzugefügt wird:
quelle
Mit der Lösung von maček habe ich sie so geändert, dass sie mit der Art und Weise funktioniert, wie ASP.NET MVC ihre verschachtelten / komplexen Objekte in demselben Formular behandelt. Alles, was Sie tun müssen, ist das Validierungsstück dahingehend zu ändern:
Dadurch werden Elemente mit folgenden Namen abgeglichen und dann korrekt zugeordnet:
Und
quelle
die einfachste und genaueste Methode , die ich für dieses Problem gefunden zu verwenden war bbq - Plugin oder diese ein (was etwa 0,5 K Bytes Größe).
Es funktioniert auch mit mehrdimensionalen Arrays.
quelle
Für jQuery gibt es ein Plugin, jquery.serializeJSON . Ich habe es jetzt erfolgreich bei einigen Projekten eingesetzt. Es wirkt wie ein Zauber.
quelle
quelle
Ich bevorzuge diesen Ansatz, weil: Sie nicht über 2 Sammlungen iterieren müssen, bei Bedarf auf andere Dinge als "Name" und "Wert" zugreifen können und Ihre Werte bereinigen können, bevor Sie sie im Objekt speichern ( wenn Sie Standardwerte haben, die Sie beispielsweise nicht speichern möchten).
Verwenden Sie wie folgt:
Nur in Firefox getestet.
quelle
Verwandeln Sie alles in ein Objekt (nicht einheitlich getestet)
Die Ausgabe des Tests:
auf
wird ergeben:
quelle
Ich habe ein Problem mit der ausgewählten Lösung gefunden.
Bei Verwendung von Formularen mit Array-basierten Namen stirbt die Funktion jQuery serializeArray () tatsächlich ab.
Ich habe ein PHP-Framework, das Array-basierte Feldnamen verwendet, damit dasselbe Formular in mehreren Ansichten mehrmals auf dieselbe Seite gestellt werden kann. Dies kann nützlich sein, um das Hinzufügen, Bearbeiten und Löschen auf derselben Seite zu platzieren, ohne dass sich die Formularmodelle widersprechen.
Da ich die Formulare seralisieren wollte, ohne diese absolute Basisfunktionalität entfernen zu müssen, habe ich beschlossen, mein eigenes seralizeArray () zu schreiben:
Bitte beachten Sie: Dies funktioniert auch außerhalb des Formulars submit (). Wenn also im Rest Ihres Codes ein Fehler auftritt, wird das Formular nicht gesendet, wenn Sie auf eine Link-Schaltfläche mit der Aufschrift "Änderungen speichern" klicken.
Beachten Sie auch, dass diese Funktion niemals zum Validieren des Formulars verwendet werden sollte, nur um die Daten zu sammeln, die zur Validierung an den Server gesendet werden sollen. Die Verwendung eines solchen schwachen und massenzugewiesenen Codes führt zu XSS usw.
quelle
Ich hatte in letzter Zeit das gleiche Problem und kam mit diesem .toJSON jQuery-Plugin heraus , das ein Formular in ein JSON-Objekt mit derselben Struktur konvertiert. Dies ist auch besonders nützlich für dynamisch generierte Formulare, bei denen Ihr Benutzer an bestimmten Stellen weitere Felder hinzufügen soll.
Der Punkt ist, dass Sie möglicherweise tatsächlich ein Formular so erstellen möchten, dass es selbst eine Struktur hat. Nehmen wir also an, Sie möchten ein Formular erstellen, in das der Benutzer seine Lieblingsorte in der Stadt einfügt: Sie können sich vorstellen, dass dieses Formular ein
<places>...</places>
XML-Element darstellt, das a enthält Liste der Orte, die dem Benutzer gefallen, also eine Liste der<place>...</place>
Elemente, die jeweils beispielsweise ein<name>...</name>
Element, ein<type>...</type>
Element und dann eine Liste der<activity>...</activity>
Elemente enthalten, um die Aktivitäten darzustellen, die Sie an einem solchen Ort ausführen können. Ihre XML-Struktur würde also folgendermaßen aussehen:Wie cool wäre es, ein JSON-Objekt daraus zu haben, das genau diese Struktur darstellt, sodass Sie entweder:
OK, jetzt müssen wir uns überlegen, wie ein Formular eine XML-Datei darstellen kann.
Natürlich ist das
<form>
Tag dasroot
, aber dann haben wir das<place>
Element, das ein Container und kein Datenelement selbst ist, also können wir kein Eingabe-Tag dafür verwenden.Hier kommt der
<fieldset>
Tag zum Einsatz! Wir werden<fieldset>
Tags verwenden, um alle Containerelemente in unserer Formular- / XML-Darstellung darzustellen und so zu einem Ergebnis wie dem folgenden zu gelangen:Wie Sie in diesem Formular sehen können, verstoßen wir gegen die Regel der eindeutigen Namen. Dies ist jedoch in Ordnung, da sie in ein Array von Elementen konvertiert werden und daher nur durch ihren Index innerhalb des Arrays referenziert werden.
An diesem Punkt können Sie sehen, dass
name="array[]"
das Formular keinen ähnlichen Namen enthält und alles hübsch, einfach und semantisch ist.Jetzt möchten wir, dass dieses Formular in ein JSON-Objekt konvertiert wird, das folgendermaßen aussieht:
Zu diesem Zweck habe ich hier dieses jQuery-Plugin entwickelt, das von jemandem in diesem Code Review- Thread optimiert wurde und wie folgt aussieht:
Ich habe auch diesen einen Blog-Beitrag gemacht , um dies näher zu erläutern.
Dadurch wird alles in einem Formular in JSON konvertiert (sogar Radio und Kontrollkästchen), und Sie müssen nur noch anrufen
Ich weiß, dass es viele Möglichkeiten gibt, Formulare in JSON-Objekte zu konvertieren, und dass sie in den meisten Fällen sicher
.serialize()
und gut.serializeArray()
funktionieren. Sie sind hauptsächlich für die Verwendung gedacht, aber ich denke, diese ganze Idee , ein Formular als XML-Struktur mit aussagekräftigen Namen zu schreiben und es in ein zu konvertieren Ein wohlgeformtes JSON-Objekt ist einen Versuch wert. Auch die Tatsache, dass Sie gleichnamige Eingabe-Tags hinzufügen können, ohne sich Sorgen machen zu müssen, ist sehr nützlich, wenn Sie dynamisch generierte Formulardaten abrufen müssen.Ich hoffe das hilft jemandem!
quelle
Ich habe selbst ein Formular in ein mehrdimensionales JavaScript-Objekt codiert, um es in der Produktion zu verwenden. Das Ergebnis ist https://github.com/serbanghita/formToObject.js .
quelle
Eine andere Antwort
FormData: https://developer.mozilla.org/en-US/docs/Web/API/FormData
quelle
[UPDATE 2020]
Mit einem einfachen Oneliner in Vanille js:
quelle
Ich mag Samuels Version, aber ich glaube, es hat einen kleinen Fehler. Normalerweise wird JSON als gesendet
Nicht so wie
Die Funktion IMO sollte also lauten:
und um es in ein Datenarray zu packen (wie allgemein erwartet) und es schließlich als adstring App.stringify ({data: App.toJson ('#cropform: input')}) zu senden)
Informationen zur Stringifizierung finden Sie in Frage 3593046 für die Lean-Version und in json2.js für die Version, die alle Eventualitäten abdeckt . Das sollte alles abdecken :)
quelle
Verwenden Sie für eine schnelle, moderne Lösung das JSONify jQuery-Plugin. Das folgende Beispiel stammt wörtlich aus der GitHub README. Alle Ehre gebührt Kushal Pandya, dem Autor des Plugins.
Gegeben:
Laufen:
Produziert:
Wenn Sie mit diesem JSON-Objekt einen jQuery-POST ausführen möchten:
quelle