106 votes

Chaîne de requête JavaScript

Existe-t-il une bibliothèque JavaScript qui crée un dictionnaire à partir de la chaîne de requête, ASP.NET style ?

Quelque chose qui peut être utilisé comme :

var query = window.location.querystring["query"]?

Est "chaîne de requête" appelé quelque chose d'autre en dehors de la .NET royaume ? Pourquoi le location.search brisé en un collection clé/valeur ?

EDIT : J'ai écrit ma propre fonction, mais est-ce qu'une grande bibliothèque JavaScript fait cela ?

3 votes

A trouvé ceci : medialize.github.com/URI.js

0 votes

0 votes

231voto

CMS Points 315406

Vous pouvez extraire les paires clé/valeur du fichier location.search cette propriété contient la partie de l'URL qui suit le symbole ?, y compris le symbole ?

function getQueryString() {
  var result = {}, queryString = location.search.slice(1),
      re = /([^&=]+)=([^&]*)/g, m;

  while (m = re.exec(queryString)) {
    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }

  return result;
}

// ...
var myParam = getQueryString()["myParam"];

11 votes

Ce n'est pas une victoire. Que se passe-t-il si la valeur d'une clé contient le caractère '=' ? Par exemple, dork.com/?equation=10=2. On pourrait dire qu'elle DEVRAIT être encodée dans l'URL, mais ce n'est pas obligatoire. J'ai moi-même fait l'erreur d'écrire une fonction naïve de ce type une fois. Il y a plus d'un cas de figure que cette fonction prend en compte.

6 votes

@James, j'ai oublié de mentionner qu'il y a quelques mois j'ai modifié la fonction, maintenant elle peut correctement gérer votre exemple. dork.com/?equation=10=2 ...

2 votes

@CMS ne gère pas la possibilité d'un tableau dans une chaîne de requête qui est représentée comme telle ?val=foo&val=bar&val=baz Comment faire pour répondre à cette demande ?

22voto

Qwerty Points 1165

tl;dr solution sur une seule (ou presque) ligne de code en utilisant du javascript vanille

var queryDict = {}
location.search.substr(1).split("&").forEach(function(item) {
    queryDict[item.split("=")[0]] = item.split("=")[1]
})

Pour la chaîne de requête ?a=1&b=2&c=3&d&e il revient :

> queryDict
a: "1"
b: "2"
c: "3"
d: undefined
e: undefined

clés à valeurs multiples y caractères codés ?

Voir la réponse originale à l'adresse suivante Comment puis-je obtenir des valeurs de chaîne de requête en JavaScript ?

"?a=1&b=2&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> queryDict
a: ["1", "5", "t e x t"]
b: ["2"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

8 votes

Ce n'est pas une seule ligne, ce sont plusieurs lignes mal formatées !

1 votes

Bon sang, je ne sais pas quoi dire... Tu m'as eu. Voici une solution à plusieurs lignes : ` var queryDict = {} ; location.search.substr(1).split("&").forEach( function(item) { queryDict[item.split("=")[0]] = item.split("=")[1] ; } );`

2 votes

Haha Je l'adore ! Désolé, j'ai travaillé avec quelqu'un qui avait l'habitude de dire "J'ai trouvé un one liner qui fait x" et qui vous montrait ensuite 3 lignes avec les retours à la ligne enlevés !

11voto

Shadow2531 Points 6726

37 votes

Cela devrait être une fonction native de jquery

0 votes

@EvanMulawski Merci. Il semble que le plug-in ait disparu. J'ai ajouté un lien différent, qui pourrait aider.

0 votes

La méthode proposée par le CMS est plus simple et plus propre. Surtout si vous n'utilisez pas encore jquery.

8voto

d0ugal Points 174

Après avoir trouvé cet article, je me suis dit que je devais ajouter que je ne pense pas que la solution la plus votée soit la meilleure. Elle ne gère pas les valeurs de tableau (comme ?a=foo&a=bar - dans ce cas, je m'attendrais à ce que getting a retourne ['foo', 'bar']). Pour autant que je sache, elle ne prend pas non plus en compte les valeurs encodées - comme l'encodage de caractères hexagonaux où %20 représente un espace (exemple : ?a=Hello%20World) ou le symbole plus utilisé pour représenter un espace (exemple : ?a=Hello+World).

Node.js offre ce qui semble être une solution très complète pour l'analyse des chaînes de requête. Il serait facile de l'utiliser dans votre propre projet car il est assez bien isolé et sous une licence permissive.

Son code peut être consulté ici : https://github.com/joyent/node/blob/master/lib/querystring.js

Les tests effectués par Node peuvent être consultés ici : https://github.com/joyent/node/blob/master/test/simple/test-querystring.js Je suggérerais d'essayer certaines de ces questions avec la réponse la plus courante pour voir comment elle les traite.

J'ai également participé à un projet visant à ajouter cette fonctionnalité. Il s'agit d'un portage du module d'analyse des chaînes de requête de la librairie standard de Python. Ma fourchette peut être trouvée ici : https://github.com/d0ugal/jquery.qeeree

0 votes

Il ne s'agit pas simplement d'emprunter le code de Node,js, c'est très imbriqué.

5voto

ahkvk Points 1040

Vous pouvez également utiliser la bibliothèque sugar.js .

D'après sugarjs.com :

Object.fromQueryString ( str , deep = true )

Convertit la chaîne de requête d'une URL en un objet. Si deep est faux, la conversion n'acceptera que des paramètres peu profonds (c'est-à-dire aucun objet ou tableau avec la syntaxe []) car ceux-ci ne sont pas universellement supportés.

Object.fromQueryString('foo=bar&broken=wear') >{"foo":"bar","broken":"wear"}
Object.fromQueryString('foo[]=1&foo[]=2') >{"foo":[1,2]}

Exemple :

var queryString = Object.fromQueryString(location.search);
var foo = queryString.foo;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X