Gegeben die folgende Form:
<form>
<input name="foo" value="bar">
<input name="hello" value="hello world">
</form>
Ich kann das $.param( .. )
Konstrukt verwenden, um das Formular zu serialisieren:
$.param( $('form input') )
=> foo=bar&hello=hello+world
Wie kann ich den obigen String mit JavaScript deserialisieren und einen Hash zurückbekommen?
Beispielsweise,
$.magicFunction("foo=bar&hello=hello+world")
=> {'foo' : 'bar', 'hello' : 'hello world'}
Referenz : jQuery.param( obj )
.
javascript
jquery
seb
quelle
quelle
+
. Jetzt ersetzt es alle!QueryString
. Ich habe einen erstellt, aber er akzeptiert keine Parameter, sondern liest nur aus window.location.search. Ich erinnere mich an andere, die Parameter akzeptieren ...Antworten:
Du solltest benutzen jQuery BBQ ‚s deparam Funktion. Es ist gut getestet und dokumentiert.
quelle
Dies ist eine leicht modifizierte Version einer Funktion, die ich vor einiger Zeit geschrieben habe, um etwas Ähnliches zu tun.
quelle
Wie wäre es mit diesem kurzen funktionalen Ansatz?
Beispiel:
quelle
field[][]=a&field[0][]=b&field[0][]=c
wird so verarbeitet, wieObject { field[][]: "a", field[0][]: "c" }
sie sein sollteresultobject.field[0] = Array [ "a", "b", "c" ]
. Dies ist das von PHP erwartete Verhalten. Die Lösung von @ JackyLi kümmert sich darum.Meine Antwort:
quelle
JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)
bekomme ich{"2":["2"],"3":["4"],"":"cc"}
und nicht das,[null,null,[2],[3,4],"bb","cc"]
was ich mir erhofft hätte (das würde mir PHP geben).Ich verwende die Antwort von David Dorward und habe festgestellt, dass es sich nicht wie PHP oder Ruby on Rails verhält, wie sie die Parameter analysieren:
1) Eine Variable ist nur dann ein Array, wenn sie endet
[]
, z. B.?choice[]=1&choice[]=12
nicht, wenn sie endet?a=1&a=2
2) Wenn mehrere Parameter mit demselben Namen vorhanden sind, ersetzen die späteren die früheren wie auf PHP-Servern (Ruby on Rails behält den ersten bei und ignoriert die späteren), z
?a=1&b=2&a=3
Also habe ich Davids Version modifiziert:
das ist ziemlich gründlich getestet.
quelle
hash[k.substr(0, k.length-2)] = [v];
undhash[k.substr(0, k.length-2)].push(v);
Ich weiß, dass dies ein alter Thread ist, aber vielleicht ist er noch relevant?
Inspiriert von Jacky Lis guter Lösung versuchte ich eine kleine Variation meiner eigenen mit dem Ziel, auch beliebige Kombinationen von Arrays und Objekten als Eingabe berücksichtigen zu können. Ich schaute mir an, wie PHP das gemacht hätte und versuchte, etwas "Ähnliches" in Gang zu bringen. Hier ist mein Code:
Wenn die Funktion ohne das
str
-argument aufgerufen wird, wird siewindow.location.search.slice(1)
als Eingabe angenommen.Einige Beispiele:
führt zu
Während Jacky Lis Lösung den Außenbehälter
a
als einfaches Objekt produzieren würdegetargs()
Betrachtet den ersten angegebenen Index für eine beliebige Ebene, um festzustellen, ob diese Ebene ein Objekt (nicht numerischer Index) oder ein Array (numerisch oder leer) ist, was zu der Ausgabe führt, wie in der obigen Auflistung (Nr. 6) gezeigt.Wenn das aktuelle Objekt ein Array ist
null
, wird es an jeder Stelle eingefügt, um leere Positionen darzustellen. Arrays sind immer fortlaufend nummeriert und 0-basiert.Beachten Sie, dass im Beispiel Nr. 8 Die "automatische Inkrementierung" für leere Indizes funktioniert immer noch, obwohl es sich jetzt um ein Objekt und nicht um ein Array handelt.
Soweit ich es getestet habe,
getargs()
verhält sich mein Verhalten ziemlich identisch mit dem großartigen jQuery-$.deparam()
Plugin von Chriss Roger, das in der akzeptierten Antwort erwähnt wird. Der wesentliche Unterschied besteht darin , dassgetargs
läuft ohne jQuery und dass es funktioniert Autoincrement in Objekte während$.deparam()
wird nicht das tun:führt zu
Im
$.deparam()
Index[]
wirdundefined
anstelle eines automatisch inkrementierten numerischen Index interpretiert .quelle
o[k]=isNaN(idx[0])?{}:[];
mit der Absicht eingeführt, ein Array zu erstellen, wenn ich auf einen numerischen Index stoße, der als erster für ein neues Objekt angegeben wird. Ansonsten mache ich ein generisches Objekt. Es liegt an Ihnen, diesen Teil des Codes so zu ändern, dass er Ihren Anforderungen besser entspricht. I. e. so etwaso[k]={}
sollte den Trick machen.So können Sie eine neue jQuery-Funktion erstellen:
quelle
true
so, dass man überprüfen kannif (params.redirect)
oder ähnliches. Wenn Sie zwischentrue
und anderen Werten unterscheiden möchten , würden Sie verwendenif (params.redirect === true)
. Einnull
Wert würde in keiner Weise helfen, die ich mir vorstellen kann. Der Grund, warum ich es nicht wie David gemacht habe, ist, dass ich Konsistenz über Flexibilität schätze. Mit seiner Methode muss ich überprüfen, ob der Wert ein String oder ein Array ist, um seinen Wert zu verwenden. Meiner Meinung nach sollte es immer eine Zeichenfolge sein (dertrue
Wert wird konvertiert, in'true'
den ich denke, dass er in Ordnung ist) oder immer ein Array. Ich habe String gewählt./abc?delete
dann ist, würde ich erwarten, dass es einen Eintrag für gibtdelete
. Ich sehe nicht, wie das anders ist? Ich sehe nicht einmal, wie Sie den anderen Code aus diesem Grund bevorzugen können, da dieser Code den Wert auf die Zeichenfolge setzt,'undefined'
die nicht besser ist. Bei mehreren Werten geht es um Einfachheit und Flexibilität. Ich sehe selten die Verwendung mehrerer Werte in Abfragezeichenfolgen, aber wenn Sie sie möchten, geben Sie immer ein Array mit 1+ Werten zurück. Mischen Sie niemals den Rückgabetyp. dann Sie werden Zeit haben , um Debug zu verbringen , weil , was in der Regel eine Zeichenfolge plötzlich ein Array sein könnte.Dank ihm http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
Ziemlich einfach: D.
quelle
?something=1¶m2=value2
in einem Array zu unserialisieren / zu analysieren . Was meinst du mit "nicht mit Auswahlfeldern mit mehreren Optionen arbeiten"?Hier ist meine JavaScript-Implementierung, die ich in einer serverseitigen JScript ASP Classic- Seite ( Demo ) verwende:
quelle
benutze das :
quelle
Ich habe mir diese Lösung ausgedacht, die sich wie die .Net-Funktion verhält
HttpUtility.ParseQueryString
.Im Ergebnis werden die Abfragezeichenfolgenparameter in Eigenschaften als Wertelisten gespeichert, sodass
qsObj["param"]
dies mit dem Aufruf identisch istGetValues("param")
von .Net entspricht.Ich hoffe du magst es. JQuery nicht erforderlich.
So verwenden Sie es:
Um eine Vorschau des Ergebnisses in der Konsole anzuzeigen, geben Sie Folgendes ein:
Ausgabe:
quelle
Bei CSS-Tricks gibt es einen wunderschönen Einzeiler (Originalquelle von Nicholas Ortenzio ):
Der wirklich clevere Teil ist, wie das
this
Objekt der anonymen Funktion verwendet wird und für jede der Abfragen in der Zeichenfolge ein Schlüssel / Wert-Paar hinzugefügt wird. Trotzdem gibt es Raum für Verbesserungen. Ich habe es unten ein wenig geändert, mit den folgenden Änderungen:Behandlung von leeren Zeichenfolgen und Eingaben ohne Zeichenfolge hinzugefügt.
Behandelte URI-codierte Zeichenfolgen (
%40
->@
usw.).Die Standardverwendung von "
document.location.search
Wenn die Eingabe leer war" wurde entfernt.Der Name wurde geändert, lesbarer gemacht und Kommentare hinzugefügt.
quelle
Dies ist eine wirklich alte Frage, aber da ich gekommen bin, kommen möglicherweise andere Leute zu diesem Beitrag, und ich möchte dieses Thema ein wenig auffrischen. Heute müssen keine benutzerdefinierten Lösungen mehr erstellt werden - es gibt eine URLSearchParams- Oberfläche.
Die einzige Einschränkung, die ich kenne - diese Funktion wird in IE / Edge nicht unterstützt.
quelle
Dies ist meine Version in Coffeescript. Funktioniert auch für URL wie
http://localhost:4567/index.html?hello=[%22world%22]&world=hello#/home
quelle
Hier ist eine einfache und kompakte Version, wenn Sie die Parameter nur schnell aus einer GET-Anforderung abrufen möchten:
Es konvertiert
in ein Objekt wie
quelle
Erstellt eine serialisierte Darstellung eines Arrays oder Objekts (kann als URL-Abfragezeichenfolge für AJAX-Anforderungen verwendet werden).
quelle
Antworten könnten etwas jQuery- Eleganz gebrauchen :
Gabelung unter https://gist.github.com/956897
quelle
Sie können die Funktion
.serializeArray()
( Link ) von jQuery selbst verwenden. Diese Funktion gibt ein Array von Schlüssel-Wert-Paaren zurück. Ergebnisbeispiel:quelle