Compte tenu de la forme suivante:
<form>
<input name="foo" value="bar">
<input name="hello" value="hello world">
</form>
Je peux utiliser la $.param( .. )
construction pour sérialiser le formulaire:
$.param( $('form input') )
=> foo=bar&hello=hello+world
Comment désérialiser la chaîne ci-dessus avec JavaScript et récupérer un hachage?
Par exemple,
$.magicFunction("foo=bar&hello=hello+world")
=> {'foo' : 'bar', 'hello' : 'hello world'}
Référence: jQuery.param( obj )
.
+
. Maintenant, il les remplace tous!QueryString
. J'en ai fait un mais il n'accepte pas les paramètres, il lit uniquement à partir de window.location.search. Je me souviens d'autres qui acceptent les paramètres ...Réponses:
Vous devez utiliser jQuery BBQ de deparam fonction. C'est bien testé et documenté.
la source
Ceci est une version légèrement modifiée d'une fonction que j'ai écrite il y a quelque temps pour faire quelque chose de similaire.
la source
Qu'en est-il de cette courte approche fonctionnelle?
Exemple:
la source
field[][]=a&field[0][]=b&field[0][]=c
est traitée commeObject { field[][]: "a", field[0][]: "c" }
elle le devraitresultobject.field[0] = Array [ "a", "b", "c" ]
. C'est le comportement attendu de PHP. La solution de @ JackyLi s'occupe de cela.Ma réponse:
la source
JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)
j'obtiens{"2":["2"],"3":["4"],"":"cc"}
et non[null,null,[2],[3,4],"bb","cc"]
ce que j'aurais espéré (c'est ce que PHP me donnerait).J'utilise la réponse de David Dorward et je me suis rendu compte qu'il ne se comporte pas comme PHP ou Ruby on Rails comment ils analysent les paramètres:
1) une variable n'est un tableau que si elle se termine par
[]
, par exemple?choice[]=1&choice[]=12
, pas quand elle est?a=1&a=2
2) quand plusieurs paramètres existent avec le même nom, les derniers remplacent les premiers, comme sur les serveurs PHP (Ruby on Rails garde le premier et ignore les derniers), comme
?a=1&b=2&a=3
Alors en modifiant la version de David, j'ai:
qui est testé de manière assez approfondie.
la source
hash[k.substr(0, k.length-2)] = [v];
ethash[k.substr(0, k.length-2)].push(v);
Je sais que c'est un vieux fil, mais peut-être qu'il y a encore une certaine pertinence?
Inspiré par la bonne solution de Jacky Li, j'ai essayé une légère variation de ma part avec l'objectif de pouvoir également prendre en charge des combinaisons arbitraires de tableaux et d'objets en entrée. J'ai regardé comment PHP l'aurait fait et j'ai essayé d'obtenir quelque chose de "similaire". Voici mon code:
Si la fonction est appelée sans l'
str
argument, elle sera considéréewindow.location.search.slice(1)
comme une entrée.Quelques exemples:
résulte en
Alors que la solution de Jacky Li produirait le conteneur extérieur
a
comme un objet simplegetargs()
regarde le premier index donné pour n'importe quel niveau pour déterminer si ce niveau sera un objet (index non numérique) ou un tableau (numérique ou vide), résultant ainsi en la sortie comme indiqué dans la liste ci-dessus (n ° 6).Si l'objet courant est un tableau, les
null
s sont insérés là où c'est nécessaire pour représenter des positions vides. Les tableaux sont toujours numérotés et basés sur 0).Notez que dans l'exemple no. 8 "l'auto-incrémentation" pour les index vides fonctionne toujours, même si nous avons affaire à un objet maintenant et non à un tableau.
Pour autant que je l'ai testé, mon
getargs()
comportement est à peu près identique au grand$.deparam()
plugin jQuery de Chriss Roger mentionné dans la réponse acceptée. La principale différence est quegetargs
s'exécute sans jQuery et qu'il effectue l' auto - incrémentation dans les objets alors$.deparam()
qu'il ne le fera pas :résulte en
Dans
$.deparam()
l'index[]
est interprété comme unundefined
index numérique auto-incrémenté au lieu d'un index.la source
o[k]=isNaN(idx[0])?{}:[];
avec l'intention de créer un tableau, chaque fois que je rencontre un index numérique comme le premier donné pour un nouvel objet. Sinon, je vais créer un objet générique. C'est à vous de modifier cette partie du code pour mieux répondre à vos besoins. C'est à dire. quelque chose commeo[k]={}
ça devrait faire l'affaire.Voici comment créer une nouvelle fonction jQuery:
la source
true
pour que l'on puisse vérifierif (params.redirect)
ou similaire. Si vous souhaitez différer entre unetrue
autre valeur, vous utiliserezif (params.redirect === true)
. Unenull
valeur n'aiderait en aucune manière que je puisse penser. La raison pour laquelle je ne l'ai pas fait comme David est que j'apprécie la cohérence plutôt que la flexibilité. Avec sa méthode, je dois vérifier si la valeur est une chaîne ou un tableau pour utiliser sa valeur. À mon avis, cela devrait toujours être une chaîne (latrue
valeur convertie en'true'
ce que je pense être bien), ou toujours être un tableau. J'ai choisi la ficelle./abc?delete
alors je m'attendrais à ce qu'il y ait une entrée pourdelete
. Je ne vois pas en quoi c'est différent? Je ne vois même pas comment vous pouvez préférer l'autre code pour cette raison, car ce code définira la valeur sur la chaîne'undefined'
qui n'est pas meilleure. Et comme pour les valeurs multiples, c'est un cas de simplicité vs flexibilité. Je vois rarement l'utilisation de plusieurs valeurs dans les chaînes de requête, mais si vous les voulez, retournez toujours un tableau avec 1+ valeurs. Ne mélangez jamais le type de retour; alors vous devrez passer du temps à déboguer car ce qui était habituellement une chaîne pourrait soudainement devenir un tableau.Merci à lui http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
Assez facile: D
la source
?something=1¶m2=value2
dans un tableau. Que voulez-vous dire par "ne fonctionne pas avec des boîtes de sélection avec plusieurs options"?Voici mon implémentation JavaScript que j'utilise dans une page JScript ASP Classic côté serveur ( démo ):
la source
utilisez ceci :
la source
J'ai trouvé cette solution, qui se comporte comme la fonction .Net
HttpUtility.ParseQueryString
.Dans le résultat, les paramètres de la chaîne de requête sont stockés dans les propriétés sous forme de listes de valeurs, ce qui
qsObj["param"]
équivaut donc à appelerGetValues("param")
dans .Net.J'espère que tu aimes. JQuery n'est pas requis.
Voici comment l'utiliser:
Pour prévisualiser le résultat dans la console, tapez simplement:
Production:
la source
Il y a un beau one-liner sur CSS-Tricks (source originale de Nicholas Ortenzio ):
La partie la plus intelligente est la façon dont il utilise la fonction anonyme
this
objet de , en ajoutant une paire clé / valeur pour chacune des requêtes de la chaîne. Cela dit, il y a place à amélioration. Je l'ai modifié un peu ci-dessous, avec les changements suivants:Ajout de la gestion des chaînes vides et des entrées non-chaîne.
Chaînes codées URI gérées (
%40
->@
, etc.).Suppression de l'utilisation par défaut de
document.location.search
moment où l'entrée était vide.Changement de nom, rendu plus lisible, ajout de commentaires.
la source
C'est une question vraiment ancienne, mais comme je viens - d'autres personnes peuvent venir à ce post, et je veux rafraîchir un peu ce thème. Aujourd'hui, pas besoin de faire des solutions personnalisées - il existe une interface URLSearchParams .
La seule limitation que je connaisse - cette fonctionnalité n'est pas prise en charge dans IE / Edge.
la source
Ceci est ma version dans Coffeescript. Fonctionne également pour les URL comme
http://localhost:4567/index.html?hello=[%22world%22]&world=hello#/home
la source
En voici un simple et compact si vous souhaitez uniquement obtenir rapidement les paramètres d'une requête GET:
Il convertit
dans un objet comme
la source
Crée une représentation sérialisée d'un tableau ou d'un objet (peut être utilisée comme chaîne de requête URL pour les requêtes AJAX).
la source
les réponses pourraient utiliser un peu d' élégance jQuery :
fourchette à https://gist.github.com/956897
la source
Vous pouvez utiliser la fonction
.serializeArray()
( Link ) de jQuery lui-même. Cette fonction renvoie un tableau de paires clé-valeur. Exemple de résultat:la source