Existe-t-il un moyen sans plug-in de récupérer les valeurs de chaîne de requête via jQuery (ou sans)?
Si c'est le cas, comment? Sinon, existe-t-il un plugin qui peut le faire?
javascript
url
plugins
query-string
Ripounet
la source
la source
Réponses:
Mise à jour: sept-2018
Vous pouvez utiliser URLSearchParams qui est simple et prend en charge un navigateur décent (mais pas complet) .
Original
Vous n'avez pas besoin de jQuery à cet effet. Vous pouvez utiliser uniquement du JavaScript pur:
Usage:
Remarque: Si un paramètre est présent plusieurs fois (
?foo=lorem&foo=ipsum
), vous obtiendrez la première valeur (lorem
). Il n'y a pas de norme à ce sujet et les utilisations varient, voir par exemple cette question: Position faisant autorité des clés de requête HTTP GET en double .REMARQUE: la fonction est sensible à la casse. Si vous préférez un nom de paramètre insensible à la casse, ajoutez le modificateur «i» à RegExp
Il s'agit d'une mise à jour basée sur les nouvelles spécifications URLSearchParams pour obtenir le même résultat de manière plus succincte. Voir la réponse intitulée " URLSearchParams " ci-dessous.
la source
http://www.mysite.com/index.php?x=x1&x=x2&x=x3
La valeur du champx
est ambiguë.?mykey=0&m.+key=1
, appelergetParameterByName("m.+key")
retournerait0
au lieu de1
. Vous devez échapper les métacaractères d'expression régulièrename
avant de créer votre expression régulière. Et vous n'avez besoin d'appeler.replace()
qu'une seule fois en utilisant l'indicateur global et en utilisant"\\$&"
comme expression de remplacement. Vous devriez rechercher aulocation.search
lieu delocation.href
. Une réponse avec plus de 400 votes positifs devrait expliquer ces détails.Certaines des solutions affichées ici sont inefficaces. Répéter la recherche d'expressions régulières à chaque fois que le script doit accéder à un paramètre est complètement inutile, une seule fonction pour diviser les paramètres en un objet de style tableau associatif suffit. Si vous ne travaillez pas avec l'API HTML 5 History, cela n'est nécessaire qu'une fois par chargement de page. Les autres suggestions ici échouent également à décoder correctement l'URL.
Exemple de chaîne de requête:
Résultat:
Cela pourrait facilement être amélioré pour gérer également les chaînes de requête de style tableau. Un exemple de ceci est ici , mais puisque les paramètres de style tableau ne sont pas définis dans RFC 3986, je ne polluerai pas cette réponse avec le code source. Pour ceux intéressés par une version "polluée", regardez la réponse de campbeln ci-dessous .
En outre, comme indiqué dans les commentaires,
;
est un délimiteur légal pour leskey=value
paires. Cela nécessiterait une expression rationnelle plus compliquée à gérer;
ou&
, ce qui, à mon avis, n'est pas nécessaire car il est rare qu'il;
soit utilisé et je dirais encore plus improbable que les deux soient utilisés. Si vous avez besoin de prendre en charge;
au lieu de&
, échangez-les simplement dans l'expression régulière.Si vous utilisez un langage de prétraitement côté serveur, vous pouvez utiliser ses fonctions natives JSON pour faire le gros du travail à votre place. Par exemple, en PHP, vous pouvez écrire:
Beaucoup plus simple!
MISE À JOUR
Voici donc l'approche pour le gérer:
la source
window.location.hash
propriété, qui est distincte de lawindow.location.search
propriété. Si le hachage change, cela n'affecte pas du tout la chaîne de requête.;
s'agit d'un délimiteur légal pour leskey=value
paires GET . C'est rare, mais il faut 5 secondes pour l'implémenter.?a=b&c=d
est classique et une recommandation du W3C pour les formulaires Web, mais la spécification URI définit simplementquery = *( pchar / "/" / "?" )
.while(match = search.exec(query))
avecwhile((match = search.exec(query)) !== null)
ES2015 (ES6)
Sans jQuery
Avec une URL comme
?topic=123&name=query+string
, les éléments suivants seront renvoyés:Méthode Google
En déchirant le code de Google, j'ai trouvé la méthode qu'ils utilisent:
getUrlParameters
C'est obscurci, mais c'est compréhensible. Cela ne fonctionne pas car certaines variables ne sont pas définies.
Ils commencent à chercher des paramètres sur l'url à
?
partir du hash et aussi#
. Ensuite, pour chaque paramètre, ils se divisent en signe égalb[f][p]("=")
(qui ressembleindexOf
, ils utilisent la position du caractère pour obtenir la clé / valeur). Après l'avoir divisé, ils vérifient si le paramètre a une valeur ou non, si c'est le cas, ils stockent la valeur ded
, sinon ils continuent simplement.Au final, l'objet
d
est retourné, gérant l'échappement et le+
signe. Cet objet est comme le mien, il a le même comportement.Ma méthode en tant que plugin jQuery
Usage
Test de performance (méthode fractionnée contre méthode regex) ( jsPerf )
Code de préparation: déclaration des méthodes
Code de test fractionné
Code de test Regex
Test dans Firefox 4.0 x86 sur Windows Server 2008 R2 / 7 x64
la source
unescape
est une fonction obsolète et est remplacée pardecodeURIComponent()
, notez qu'aucune de ces fonctions ne décodera correctement a+
en caractère espace. 2. Vous devez déclarer le résultat en tant qu'objet plutôt qu'en tant que tableau, car JavaScript n'a pas de tableaux associatifs en soi et le tableau que vous déclarez est traité comme un objet en lui affectant de toute façon des propriétés nommées.window.location
rend tout problème de performance inutile, étant donné que le client naviguant vers l'URL est beaucoup, beaucoup plus cher.Version améliorée de la réponse d' Artem Barger :
Pour plus d'informations sur l'amélioration, voir: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/
la source
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
.null
si le paramètre n'est pas suivi de '='. Vous pouvez ajouter un préfixeif (!RegExp('[?&]'+name+'(&.*)?$').exec(window.location.search)) return false;
pour le faire revenirboolean false
si le paramètre n'est pas là du tout.new
préfixe lors de la création de l'expression régulière:var match = new RegExp('...
.replace('\u200E', '')
var results = new RegExp('[\\?&]' + name + '=([^&#/]*)').exec(url);
URLSearchParams
Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ et Chrome 49+ prennent en charge l' API URLSearchParams :
Il existe un polyfill URLSearchParams suggéré par Google pour les versions stables d'IE.
Il n'est pas normalisé par le W3C , mais c'est un niveau de vie par WhatWG .
Vous pouvez l'utiliser sur
location
:ou
Ou bien sûr sur n'importe quelle URL:
Vous pouvez également obtenir des paramètres en utilisant une
.searchParams
propriété abrégée sur l'objet URL, comme ceci:Vous lisez / paramètres fixés par la
get(KEY)
,set(KEY, VALUE)
,append(KEY, VALUE)
API. Vous pouvez également parcourir toutes les valeursfor (let p of params) {}
.Une implémentation de référence et un exemple de page sont disponibles pour l'audit et les tests.
la source
.get
au lieu de simplement.
slice(1)
allumer.search
, vous pouvez l'utiliser directement. URLSearchParams peut gérer le début?
.URLSearchParams
n'est pas bon car il ne renvoie pas les valeurs réelles des paramètres d'une URL.new URL('https://example.com?foo=1&bar=2')
ne fonctionne pas pour l'url Androidfile:///android_asset/...
Juste une autre recommandation. Le plugin Purl permet de récupérer toutes les parties de l'URL, y compris l'ancre, l'hôte, etc.
Il peut être utilisé avec ou sans jQuery.
L'utilisation est très simple et cool:
Cependant, depuis le 11 novembre 2014, Purl n'est plus géré et l'auteur recommande d'utiliser plutôt URI.js. Le plugin jQuery est différent en ce qu'il se concentre sur les éléments - pour une utilisation avec des chaînes, utilisez simplement
URI
directement, avec ou sans jQuery. Un code similaire ressemblerait à cela, des documents plus complets ici :la source
tl; dr
Une solution rapide et complète , qui gère les clés à plusieurs valeurs et les caractères encodés .
Multi-doublé:Qu'est-ce que tout ce code ...
Exemple:"coalescence nulle" , évaluation des courts-circuits
ES6 Affectations de destruction , fonctions fléchées , chaînes de modèle
En savoir plus ... sur la solution JavaScript Vanilla.
Pour accéder à différentes parties d'une URL, utilisez
location.(search|hash)
Solution la plus simple (factice)
Clés à valeurs multiples
Vérification simple des clés
(item in dict) ? dict.item.push(val) : dict.item = [val]
qd.key[index]
ouqd[key][index]
Caractères codés?
Utilisez
Exemple:decodeURIComponent()
pour la deuxième ou les deux divisions.Des commentaires
* !!! Veuillez noter que cela
decodeURIComponent(undefined)
renvoie une chaîne"undefined"
. La solution réside dans une utilisation simple de&&
, ce qui garantit qu'ildecodeURIComponent()
n'est pas appelé sur des valeurs non définies. (Voir la "solution complète" en haut.)Si la chaîne de requête est vide (
location.search == ""
), le résultat est quelque peu trompeurqd == {"": undefined}
. Il est suggéré de vérifier la chaîne de requête avant de lancer la fonction d'analyse comme:la source
array.forEach()
en injectant du code au début de votre script. voir Polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…var qd = {}; location.search.substr(1).split("&").forEach( function(item) { var s = item.split("="), k = s[0], v; if(s.length>1) v = decodeURIComponent(s[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v] })
Roshambo sur snipplr.com dispose d'un script simple pour y parvenir décrit dans Obtenir les paramètres d'URL avec jQuery | Amélioré . Avec son script, vous obtenez également facilement les paramètres que vous souhaitez.
Voici l'essentiel:
Ensuite, obtenez simplement vos paramètres à partir de la chaîne de requête.
Donc, si la chaîne URL / requête était
xyz.com/index.html?lang=de
.Appelez simplement
var langval = $.urlParam('lang');
, et vous l'avez.UZBEKJON a également un excellent article sur ce sujet, Obtenez les paramètres et valeurs d'URL avec jQuery .
la source
0
? Bien sûr, je pourrais utiliser un contrôle d'égalité strict, mais ne devrait-il pas en être ainsinull
?Si vous utilisez jQuery, vous pouvez utiliser une bibliothèque, telle que jQuery BBQ: Back Button & Query Library .
Edit: Ajout de Deparam Exemple:
Si vous souhaitez simplement utiliser JavaScript, vous pouvez utiliser ...
En raison de la nouvelle API d'historique HTML et spécifiquement
history.pushState()
ethistory.replaceState()
, l'URL peut changer, ce qui invalidera le cache des paramètres et leurs valeurs.Cette version mettra à jour son cache interne de paramètres à chaque changement d'historique.
la source
Utilisez simplement deux divisions :
Je lisais toutes les réponses précédentes et plus complètes. Mais je pense que c'est la méthode la plus simple et la plus rapide. Vous pouvez vérifier dans ce benchmark jsPerf
Pour résoudre le problème dans le commentaire de Rup, ajoutez un fractionnement conditionnel en remplaçant la première ligne par les deux ci-dessous. Mais la précision absolue signifie qu'il est maintenant plus lent que regexp (voir jsPerf ).
Donc, si vous savez que vous ne rencontrerez pas le contre-cas de Rup, cela gagne. Sinon, regexp.
la source
get('value')
surhttp://the-url?oldvalue=1&value=2
.half
c'est vrai, cela retourne null pour un paramètre vide comme?param=
. Il doit retourner la chaîne vide dans ce cas, et la vérificationhalf !== undefined
résout cela.function get(param){return decodeURIComponent((location.search.split(param+'=')[1]||'').split('&')[0])}
return half !== undefined ? decodeURIComponent(half[1].split('&')[0]) : null;
faire fonctionnerVoici ma tentative pour faire de l'excellente solution d'Andy E un plugin jQuery à part entière:
La syntaxe est:
Le meilleur des deux mondes!
la source
Si vous faites plus de manipulation d'URL que d'analyser simplement la chaîne de requête, vous pouvez trouver URI.js utile. Il s'agit d'une bibliothèque pour manipuler les URL - et est livré avec toutes les cloches et les sifflets. (Désolé pour l'auto-publicité ici)
pour convertir votre chaîne de requête en carte:
(URI.js aussi « fixe » mauvais querystrings aiment
?&foo&&bar=baz&
à?foo&bar=baz
)la source
var data = URI.parseQuery('?foo=bar&bar=baz&foo=world');
pour le même résultat ( docs ).J'aime la solution de Ryan Phelan . Mais je ne vois aucun intérêt à étendre jQuery pour cela? Il n'y a aucune utilisation de la fonctionnalité jQuery.
D'un autre côté, j'aime la fonction intégrée dans Google Chrome: window.location.getParameter.
Alors pourquoi ne pas l'utiliser? D'accord, les autres navigateurs n'en ont pas. Créons donc cette fonction si elle n'existe pas:
Cette fonction est plus ou moins de Ryan Phelan, mais elle est enveloppée différemment: nom clair et aucune dépendance des autres bibliothèques javascript. Plus d'informations sur cette fonction sur mon blog .
la source
Voici un moyen rapide d'obtenir un objet similaire au tableau PHP $ _GET :
Usage:
Pour la chaîne de requête,
x=5&y&z=hello&x=6
cela renvoie l'objet:la source
(function($) { $.extend({ get_query: function (name) { var url = location.href; var qs = url.substring(url.indexOf('?') + 1).split('&'); for(var i = 0, result = {}; i < qs.length; i++){ qs[i] = qs[i].split('='); result[qs[i][0]] = qs[i][1]; } return result; } }); })(jQuery);
et utilisez comme ceci:$.get_query()
location.href
devrait être remplacé parlocation.search
.Restez simple avec du code JavaScript simple:
Appelez-le de n'importe où dans le code JavaScript:
la source
window.location.search
!Ce sont toutes d'excellentes réponses, mais j'avais besoin de quelque chose d'un peu plus robuste, et j'ai pensé que vous aimeriez tous avoir ce que j'ai créé.
Il s'agit d'une méthode de bibliothèque simple qui effectue la dissection et la manipulation des paramètres d'URL. La méthode statique a les sous-méthodes suivantes qui peuvent être appelées sur l'URL du sujet:
Exemple:
la source
Du MDN :
la source
Code golf:
Affichez-le!
Sur mon Mac:
test.htm?i=can&has=cheezburger
affichela source
J'utilise beaucoup d'expressions régulières, mais pas pour ça.
Il me semble plus facile et plus efficace de lire la chaîne de requête une fois dans mon application et de construire un objet à partir de toutes les paires clé / valeur comme:
Pour une URL comme
http://domain.com?param1=val1¶m2=val2
vous pouvez obtenir leur valeur plus tard dans votre code au fursearch.param1
et à mesuresearch.param2
.la source
la source
La méthode Roshambo jQuery ne s'occupait pas de décoder l'URL
Je viens d'ajouter cette capacité également lors de l'ajout dans la déclaration de retour
Vous pouvez maintenant trouver l'essentiel mis à jour:
la source
J'aime celui-ci (tiré de jquery-howto.blogspot.co.uk):
Fonctionne très bien pour moi.
la source
Voici ma modification de cette excellente réponse - avec une possibilité supplémentaire d'analyser les chaînes de requête avec des clés sans valeurs.
IMPORTANT!Le paramètre de cette fonction dans la dernière ligne est différent. C'est juste un exemple de la façon dont on peut lui passer une URL arbitraire. Vous pouvez utiliser la dernière ligne de la réponse de Bruno pour analyser l'URL actuelle.
Alors qu'est-ce qui a changé exactement? Avec l'url, les
http://sb.com/reg/step1?param=
résultats seront les mêmes. Mais avec l'URL,http://sb.com/reg/step1?param
la solution de Bruno renvoie un objet sans clé, tandis que la mienne renvoie un objet avec cléparam
etundefined
valeur.la source
J'avais besoin d'un objet de la chaîne de requête et je déteste beaucoup de code. Ce n'est peut-être pas le plus robuste de l'univers, mais ce ne sont que quelques lignes de code.
Une URL comme
this.htm?hello=world&foo=bar
va créer:la source
decodeURIComponent
la valeur que vous stockez - et sans doute la clé également, mais vous êtes moins susceptible d'utiliser des chaînes impaires à cet égard.?a&b&c
mais c'est vraiment très lisible (et d'ailleurs similaire à ma première idée). De plus,split
c'est redondant, mais j'ai des poissons plus performants à faire frire que de diviser deux fois une chaîne de 10 caractères.location.search.substr(1)
au lieu delocation.href.split('?')[1]
pour éviter de prendre hash (#anchor
) avec le dernier paramètre de requête.location.search
!Voici une version étendue de la version liée de "Handle array-style query strings" d'Andy E. Correction d'un bug (
?key=1&key[]=2&key[]=3
;1
est perdu et remplacé par[2,3]
), a apporté quelques améliorations mineures aux performances (re-décodage des valeurs, recalcul de la position "[", etc.) et a ajouté un certain nombre d'améliorations (fonctionnalisées, prise en charge?key=1&key=2
, prise en charge des;
délimiteurs) . J'ai laissé les variables énormément courtes, mais j'ai ajouté de nombreux commentaires pour les rendre lisibles (oh, et j'ai réutilisév
dans les fonctions locales, désolé si cela prête à confusion;).Il gérera la chaîne de requête suivante ...
... ce qui en fait un objet qui ressemble à ...
Comme vous pouvez le voir ci-dessus, cette version gère une certaine mesure des tableaux "malformés", c'est-à-dire -
person=neek&person[]=jeff&person[]=jim
ou alorsperson=neek&person=jeff&person=jim
que la clé est identifiable et valide (au moins dans NameValueCollection.Add de dotNet ):Il semble que le jury soit un peu sur les touches répétées car il n'y a aucune spécification. Dans ce cas, plusieurs clés sont stockées dans un (faux) tableau. Mais notez que je ne traite pas les valeurs basées sur des virgules dans des tableaux.
Le code:
la source
q = decodeURIComponent(window.location.search.substring(1)),
aide à le faire aussi.C'est une fonction que j'ai créée il y a quelque temps et j'en suis très satisfait. Il n'est pas sensible à la casse - ce qui est pratique. De plus, si le QS demandé n'existe pas, il renvoie simplement une chaîne vide.
J'utilise une version compressée de cela. Je publie non compressé pour les types novices pour mieux expliquer ce qui se passe.
Je suis sûr que cela pourrait être optimisé ou fait différemment pour fonctionner plus rapidement, mais cela a toujours fonctionné très bien pour ce dont j'ai besoin.
Prendre plaisir.
la source
Nous venons de publier arg.js , un projet visant à résoudre ce problème une fois pour toutes. Cela a toujours été si difficile, mais maintenant vous pouvez faire:
ou obtenir le tout:
et si vous vous souciez de la différence entre
?query=true
et#hash=true
alors vous pouvez utiliser les méthodesArg.query()
etArg.hash()
.la source
Le problème avec la première réponse à cette question est que ce ne sont pas les paramètres pris en charge placés après #, mais parfois il est également nécessaire d'obtenir cette valeur.
J'ai modifié la réponse pour lui permettre d'analyser une chaîne de requête complète avec un signe de hachage également:
la source
Et voici comment vous pouvez utiliser cette fonction en supposant que l'URL est
la source
?stringtext&stringword=foo
.Si vous utilisez Browserify, vous pouvez utiliser le
url
module de Node.js :Pour en savoir plus: URL Node.js v0.12.2 Manual & Documentation
EDIT: Vous pouvez utiliser l' interface URL , son assez largement adoptée dans presque tous les nouveaux navigateurs et si le code va s'exécuter sur un ancien navigateur, vous pouvez utiliser un polyfill comme celui-ci . Voici un exemple de code sur la façon d'utiliser l'interface URL pour obtenir des paramètres de requête (également appelés paramètres de recherche)
Vous pouvez également utiliser URLSearchParams pour cela, voici un exemple de MDN pour le faire avec URLSearchParams:
la source
url
API du module est ici: nodejs.org/api/url.html