Je dois analyser la chaîne de requête www.mysite.com/default.aspx?dest=aboutus.aspx
. Comment obtenir le dest
en JavaScript ?
Vous devez également décoder tous les caractères spéciaux qui ont été encodés en pourcentage
Je dois analyser la chaîne de requête www.mysite.com/default.aspx?dest=aboutus.aspx
. Comment obtenir le dest
en JavaScript ?
Voici une méthode simple et rapide pour analyser les chaînes de requête en JavaScript :
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (decodeURIComponent(pair[0]) == variable) {
return decodeURIComponent(pair[1]);
}
}
console.log('Query variable %s not found', variable);
}
Demandez maintenant à page.html?x=Hello :
console.log(getQueryVariable('x'));
Vous devez également décoder tous les caractères spéciaux qui ont été encodés en pourcentage
Facile, mais pas très rapide si vous avez besoin d'obtenir plus d'une valeur de requête. Je pense qu'une meilleure abstraction est de retourner un objet JS avec toutes les paires nom-valeur de la chaîne de requête
De même, le split("=") n'est pas suffisant, vous pouvez avoir une paire "nom=valeur" où la valeur contient un '=' non encodé. La solution est de faire un indexOf('=') pour trouver le premier '=', et la sous-chaîne avant et après.
function parseQuery(queryString) {
var query = {};
var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
}
return query;
}
Transforme une chaîne de requête comme hello=1&another=2
en objet {hello: 1, another: 2}
. À partir de là, il est facile d'extraire la variable dont vous avez besoin.
Cela dit, il ne traite pas des cas de tableaux tels que "hello=1&hello=2&hello=3"
. Pour travailler avec cela, vous devez vérifier si une propriété de l'objet que vous créez existe avant de l'ajouter, et transformer la valeur de cette propriété en un tableau, en y ajoutant d'éventuels bits supplémentaires.
Si b est un tableau d'un seul élément, cette fonction échouera. ex. somesite.com/?varrible1=data&varrible2= ex. somesite.com/?varrible1=data&varrible
for (var i in a)
échoue car il pourrait énumérer des noms d'objets en plus des valeurs d'index de tableau.
Vous pouvez également utiliser l'excellent URI.js bibliothèque de Rodney Rehm . Voici comment :-
var qs = URI('www.mysite.com/default.aspx?dest=aboutus.aspx').query(true); // == { dest : 'aboutus.aspx' }
alert(qs.dest); // == aboutus.aspx
Et pour analyser la chaîne de requête de la page actuelle:-
var $_GET = URI(document.URL).query(true); // ala PHP
alert($_GET['dest']); // == aboutus.aspx
Que fait l'argument dans la partie .query(true) ? S'agit-il de renvoyer la requête sous la forme d'un objet clé-valeur au lieu de la chaîne de caractères de la requête ?
@bigp Yup .query()
renvoie la chaîne de requête dans foo=bar&hello=world
format alors que .query(true)
analyse la chaîne de requête en un objet, par exemple, { foo : 'bar', hello : 'world' }
.
Cool, mais les solutions nécessitant des bibliothèques tierces ne sont pas idéales. Je suis quelque peu surpris que cette solution ait reçu autant de votes positifs. Sans vouloir offenser @SalmanPK
Moi aussi ! http://jsfiddle.net/drzaus/8EE8k/
(Note : sans vérification fantaisiste de l'imbrication ou du dédoublement)
deparam = (function(d,x,params,p,i,j) {
return function (qs) {
// start bucket; can't cheat by setting it in scope declaration or it overwrites
params = {};
// remove preceding non-querystring, correct spaces, and split
qs = qs.substring(qs.indexOf('?')+1).replace(x,' ').split('&');
// march and parse
for (i = qs.length; i > 0;) {
p = qs[--i];
// allow equals in value
j = p.indexOf('=');
// what if no val?
if(j === -1) params[d(p)] = undefined;
else params[d(p.substring(0,j))] = d(p.substring(j+1));
}
return params;
};//-- fn deparam
})(decodeURIComponent, /\+/g);
Et des tests :
var tests = {};
tests["simple params"] = "ID=2&first=1&second=b";
tests["full url"] = "http://blah.com/?third=c&fourth=d&fifth=e";
tests['just ?'] = '?animal=bear&fruit=apple&building=Empire State Building&spaces=these+are+pluses';
tests['with equals'] = 'foo=bar&baz=quux&equals=with=extra=equals&grault=garply';
tests['no value'] = 'foo=bar&baz=&qux=quux';
tests['value omit'] = 'foo=bar&baz&qux=quux';
var $output = document.getElementById('output');
function output(msg) {
msg = Array.prototype.slice.call(arguments, 0).join("\n");
if($output) $output.innerHTML += "\n" + msg + "\n";
else console.log(msg);
}
var results = {}; // save results, so we can confirm we're not incorrectly referencing
$.each(tests, function(msg, test) {
var q = deparam(test);
results[msg] = q;
output(msg, test, JSON.stringify(q), $.param(q));
output('-------------------');
});
output('=== confirming results non-overwrite ===');
$.each(results, function(msg, result) {
output(msg, JSON.stringify(result));
output('-------------------');
});
Résultats en :
simple params
ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
full url
http://blah.com/?third=c&fourth=d&fifth=e
{"fifth":"e","fourth":"d","third":"c"}
fifth=e&fourth=d&third=c
-------------------
just ?
?animal=bear&fruit=apple&building=Empire State Building&spaces=these+are+pluses
{"spaces":"these are pluses","building":"Empire State Building","fruit":"apple","animal":"bear"}
spaces=these%20are%20pluses&building=Empire%20State%20Building&fruit=apple&animal=bear
-------------------
with equals
foo=bar&baz=quux&equals=with=extra=equals&grault=garply
{"grault":"garply","equals":"with=extra=equals","baz":"quux","foo":"bar"}
grault=garply&equals=with%3Dextra%3Dequals&baz=quux&foo=bar
-------------------
no value
foo=bar&baz=&qux=quux
{"qux":"quux","baz":"","foo":"bar"}
qux=quux&baz=&foo=bar
-------------------
value omit
foo=bar&baz&qux=quux
{"qux":"quux","foo":"bar"} <-- it's there, i swear!
qux=quux&baz=&foo=bar <-- ...see, jQuery found it
-------------------
Que se passe-t-il si l'une des variables de la chaîne de requête contient le signe = (égal) ?
@WebolizeR -- compte tenu de la valeur contenant =
aurait dû être encodé, il ne devrait pas y avoir de problème jsfiddle.net/8EE8k/15
Voici ma version, basée sur la version de Braceyard ci-dessus, mais avec l'analyse dans un "dictionnaire" et la prise en charge des arguments de recherche sans "=". Je l'utilise dans ma fonction JQuery $(document).ready(). Les arguments sont stockés sous forme de paires clé/valeur dans argsParsed, que vous voudrez peut-être sauvegarder quelque part...
'use strict';
function parseQuery(search) {
var args = search.substring(1).split('&');
var argsParsed = {};
var i, arg, kvp, key, value;
for (i=0; i < args.length; i++) {
arg = args[i];
if (-1 === arg.indexOf('=')) {
argsParsed[decodeURIComponent(arg).trim()] = true;
}
else {
kvp = arg.split('=');
key = decodeURIComponent(kvp[0]).trim();
value = decodeURIComponent(kvp[1]).trim();
argsParsed[key] = value;
}
}
return argsParsed;
}
parseQuery(document.location.search);
J'ajouterais if(args[i].length){ comme première ligne de la boucle afin d'éviter les clés vides dans argsParsed.
@ghigo Oui, vérifier la présence d'une clé de longueur nulle serait une bonne idée, peut-être après l'élagage. Il n'y avait aucune raison d'utiliser unescape(), je ne me souviens plus d'où je l'ai copié ;-)
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.
0 votes
Jetez un coup d'œil à cette solution . En utilisant cette fonction, il suffirait de ne pas appeler
gup('dest')
pour récupérer l'URLdest
paramètre.0 votes
Function qs(search_for) { var query = window.location.search.substring(1) ; var parms = query.split('&') ; for (var i = 0 ; i < parms.length ; i++) { var pos = parms[i].indexOf('=') ; if (pos > 0 && search_for == parms[i].substring(0, pos)) { return parms[i].substring(pos + 1) ; } } return "" ; } //utilisation : document.write(qs("isFolderLevel")) ;
0 votes
codepen.io/iegik/pen/NGRzoY?editors=101
0 votes
Vieille menace, mais les gens la recherchent toujours, comme moi. gist.github.com/cowboy/1025817
0 votes
J'ai rédigé un dossier qui pourrait vous intéresser, uqs qui vous permet de faire
var params = QS.parse(location.search); console.info(params['dest']); // > 'aboutus.aspx'
0 votes
J'utilise simplement le paquet query-string : npmjs.com/package/query-string
0 votes
Pas un doublon. obtenir est différent de analyse syntaxique .
38 votes
Il existe déjà une fonction (non IE) pour faire cela en javascript natif, pas besoin de réinventer la roue : developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
0 votes
Dans toutes les réponses à cette question, il manque un élément crucial, spécifié à l'adresse suivante url.spec.whatwg.org/#concept-urlencoded-parser -- remplacement du signe plus dans les noms et valeurs des variables de la chaîne de requête par un espace.
0 votes
Il s'agit de la version la plus compacte :
const qs = (qs) => qs.substring(1).split('&').reduce((m, arg) => {const [key, value] = arg.split('='); m[key] = value; return m;}, {});
. rappelez-vous que la valeur que vous devez transmettre à cette fonction doit ressembler à ceci?aaa=12&b&c
le résultat sera une carte de toutes les clés et valeurs.0 votes
Si vous avez besoin d'une solution isomorphe de petite taille, consultez le site suivant bundlephobia.com/result?p=isomorphic-querystring@1.2.3
1 votes
La solution simple est la suivante var url = "www.mysite.com/default.aspx?dest=aboutus.aspx" var query = new URLSearchParams(url.split(" ?")[1]) query.get('dest')
0 votes
Les
search
de la propriétéLocation
fournit la chaîne d'interrogation et la plupart des navigateurs modernes fournissent l'interfaceURLSearchParams
pour se faciliter la vie.