Comment obtenir la valeur des paramètres GET?


1328

J'ai une URL avec certains paramètres GET comme suit:

www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 

J'ai besoin d'obtenir la valeur totale de c. J'ai essayé de lire l'URL, mais je n'ai obtenu que m2. Comment faire cela en utilisant JavaScript?


Avant de publier une nouvelle réponse, considérez qu'il existe déjà plus de 50 réponses à cette question. Veuillez vous assurer que votre réponse fournit des informations qui ne figurent pas parmi les réponses existantes.
janniks

Réponses:


2001

JavaScript lui-même n'a rien intégré pour gérer les paramètres de chaîne de requête.

Code fonctionnant dans un navigateur (moderne), vous pouvez utiliser l' URLobjet (qui fait partie des API fournies par les navigateurs à JS):

var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href
var url = new URL(url_string);
var c = url.searchParams.get("c");
console.log(c);


Pour les navigateurs plus anciens (y compris Internet Explorer), vous pouvez utiliser ce polyfill ou le code de la version originale de cette réponse antérieure à URL:

Vous pouvez y accéder location.search, ce qui vous donnerait du ?caractère à la fin de l'URL ou au début de l'identificateur de fragment (#foo), selon la première éventualité.

Ensuite, vous pouvez l'analyser avec ceci:

function parse_query_string(query) {
  var vars = query.split("&");
  var query_string = {};
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var key = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);
    // If first entry with this name
    if (typeof query_string[key] === "undefined") {
      query_string[key] = decodeURIComponent(value);
      // If second entry with this name
    } else if (typeof query_string[key] === "string") {
      var arr = [query_string[key], decodeURIComponent(value)];
      query_string[key] = arr;
      // If third or later entry with this name
    } else {
      query_string[key].push(decodeURIComponent(value));
    }
  }
  return query_string;
}

var query_string = "a=1&b=3&c=m2-m3-m4-m5";
var parsed_qs = parse_query_string(query_string);
console.log(parsed_qs.c);

Vous pouvez obtenir la chaîne de requête à partir de l'URL de la page actuelle avec:

var query = window.location.search.substring(1);
var qs = parse_query_string(query);

Pour les navigateurs plus anciens, vous pouvez avoir besoin d'un polyfill pourURL en plus de celui pour URLSearchParams. Ou vous pouvez esquiver ce problème en remplaçant la ligne var c = url.searchParams.get("c");de la réponse ci-dessus par var c = new URLSearchParams(window.location.search).get("c");.
evanrmurphy

parse_query_string échouera pour les valeurs qui contiennent '=', comme lors du passage d'une valeur encodée en base64 comme valeur. La version utilisant l'expression régulière ci-dessous fonctionne mieux.
Manel Clos

7
@Jamland - Absolument pas. Ça va casser des choses. Voici une démonstration en direct qui new URL() s'attend à recevoir une URL correctement codée comme argument. decodeURIComponents'attend à recevoir un composant d'une URL, pas une URL entière.
Quentin

@Quentin J'ai vérifié différents caractères spéciaux et je vois que vous avez raison. decodeURIComponentne devrait pas être utilisé dans ce cas
Jamland

1
La parse_query_stringfonction effectue un double décodage de value. Le =problème mentionné par @ManelClos peut être résolu en ajoutant un second paramètre 2( limit) à vars[i].split().
Jake

242

La plupart des implémentations que j'ai vues manquent le décodage d'URL des noms et des valeurs.

Voici une fonction d'utilité générale qui effectue également le décodage d'URL approprié:

function getQueryParams(qs) {
    qs = qs.split('+').join(' ');

    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);

3
Ce code ne fonctionne pas. Il crée une boucle infinie car l'expression régulière est compilée dans la définition de boucle qui réinitialise l'index en cours. Cela fonctionne correctement si vous placez l'expression régulière dans une variable à l'extérieur de la boucle.
maxhawkins

2
@maxhawkins: Cela fonctionne dans certains navigateurs alors qu'il irait dans une boucle infinie dans d'autres. Vous avez à moitié raison à cet égard. Je vais corriger le code pour qu'il soit multi-navigateur. Merci d'avoir fait remarquer cela!
Ates Goral

3
@ZiTAL Cette fonction doit être utilisée avec la partie requête d'une URL, pas avec l'URL entière. Voir l'exemple d'utilisation commenté ci-dessous.
Ates Goral

1
L'insensibilité à la casse @Harvey n'est pas une préoccupation des paramètres de requête. Cela ressemble à une chose spécifique à l'application qui doit être appliquée avec ou au-dessus de l'extraction des paramètres de requête.
Ates Goral

7
Pourquoi qs.split('+').join(' ');et non qs.replace(/\+/g, ' ');?
FlameStorm

234

la source

function gup( name, url ) {
    if (!url) url = location.href;
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( url );
    return results == null ? null : results[1];
}
gup('q', 'hxxp://example.com/?q=abc')

8
Je préfère cette option, mais je préfère retourner null ou le résultat, mais pas une chaîne vide.
Jason Thrasher

1
Il semble que vous ayez des caractères d'échappement supplémentaires. "\\[" devrait être "\[". Comme ce sont des chaînes régulières, les [et] n'ont pas besoin d'être échappés.
EricP

Ce n'est pas insensible à la casse. Où ajouter le «i» pour le rendre insensible à la casse?
zeta

alert (gup ('UserID', window.location.href));
Arun Prasad ES

6
@mottie dead link
invotez le

202

C'est un moyen simple de vérifier un seul paramètre:

Exemple d'URL:

    http://myserver/action?myParam=2

Exemple Javascript:

    var myParam = location.search.split('myParam=')[1]

si "myParam" existe dans l'URL ... la variable myParam contiendra "2", sinon elle ne sera pas définie.

Vous souhaitez peut-être une valeur par défaut, dans ce cas:

    var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';

Mise à jour: cela fonctionne mieux:

    var url = "http://www.example.com/index.php?myParam=384&login=admin"; // or window.location.href for current url
    var captured = /myParam=([^&]+)/.exec(url)[1]; // Value is in [1] ('384' in our case)
    var result = captured ? captured : 'myDefaultValue';

Et cela fonctionne bien même lorsque l'URL est pleine de paramètres.


36
Cela ne fonctionne que si le paramètre que vous saisissez est le dernier de l'URL, dont vous ne devriez pas dépendre (même si vous n'attendez qu'un seul paramètre). par exemple http://myserver/action?myParam=2&anotherParam=3ne donnerait pas "2"mais "2&anotherParam=3".
Glacials

39
(location.search.split('myParam=')[1]||'').split('&')[0]- à utiliser avec plusieurs paramètres ou possibliy manquant myParam .
Gábor Imre

oulocation.search.split('myParam=').splice(1).join('').split('&')[0]
J.Steve

1
Vous pouvez gagner plus de précision et autoriser n'importe quel ordre de paramètres en ajoutant au préalable [?|&]comme dans[?|&]myParam=([^&]+)
1,21 gigawatts

1
Vous devrez peut-être décoder la valeurresult = decodeURIComponent(result);
1,21 gigawatts

126

Les fournisseurs de navigateurs ont mis en œuvre une manière native de le faire via URL et URLSearchParams.

let url = new URL('http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5');
let searchParams = new URLSearchParams(url.search);
console.log(searchParams.get('c'));  // outputs "m2-m3-m4-m5"

Actuellement pris en charge dans Firefox, Opera, Safari, Chrome et Edge. Pour une liste de prise en charge du navigateur, voir ici .

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

https://url.spec.whatwg.org/

Eric Bidelman, ingénieur chez Google, recommande d' utiliser ce polyfill pour les navigateurs non pris en charge.


Selon les liens MDN, l'URL de prise en charge de Safari, mais pas URLSearchParams.
Mark Thomson

3
@Markouver N'est-ce pas le polyfill qui s'en occupe? BTW, Safari est l'IE6 des temps modernes
Csaba Toth

Pourquoi new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')revient nullpour moi? (Sur Chrome stable). bet csemblent bien fonctionner.
ripper234

Réponse mise à jour. Ma réponse d'origine n'utilisait pas correctement URLSearchParams, car elle n'est conçue que pour fonctionner avec la partie chaîne de requête de l'URL.
cgatian

1
Utilisez url.searchParamsplutôt new URLSearchParams(url.search).
Caio Tarifa

86

J'ai trouvé cela il y a très longtemps, très facile:

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }

Ensuite, appelez-le comme ceci:

var fType = getUrlVars()["type"];

7
+1 excellente solution - les conditions d'utilisation sont élégantes, efficaces et intelligentes. Pour mes fins mieux que l'autre solution acceptée
Elemental

court + simple + puissant = super
mzy

1
Très bien, cela fonctionne aussi en utilisant location.search au lieu de window.location.href
Fabio C.

1
@pdxbmw Il est inutile et doit être supprimé. Le code peut sembler intelligent à première vue, mais n'est pas très bien pensé. Améliorations: Utilisez decodeURIComponent()sur la valeur, car c'est ce avec quoi vous voulez habituellement travailler; utilisez window.location.searchplutôt window.location.href, car vous ne vous intéressez qu'aux paramètres, pas à l'url entière.
Leif

2
La suggestion de @Leif a très bien fonctionné. J'obtenais un ID 142 # car à la fin de l'URL le # était généré sur un clic de bouton. Quitter la fonction comme çavar vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Andres Ramos

77

Vous pouvez obtenir la chaîne de requête location.search, puis vous pouvez tout fractionner après le point d'interrogation:

var params = {};

if (location.search) {
    var parts = location.search.substring(1).split('&');

    for (var i = 0; i < parts.length; i++) {
        var nv = parts[i].split('=');
        if (!nv[0]) continue;
        params[nv[0]] = nv[1] || true;
    }
}

// Now you can get the parameters you want like so:
var abc = params.abc;

3
Qu'en est-il du décodage URL des noms et valeurs des paramètres?
Ates Goral

Cette approche ne gère pas les tableaux. Par exemple, ?array[]=1&array[]=2produit {"array[]": "2"}, ce qui est clairement faux.
Kafoso

@Kafoso Il n'y a pas de vrai ou de faux clair ici. Tout d'abord, les champs répétés avec les mêmes noms n'ont pas de comportement standard spécifié et sont à la charge de l'analyseur. De plus, le []modèle n'a de sens que dans certains cas (par exemple, PHP), mais pas dans d'autres. Donc, pas "clairement faux" - tout simplement pas implémenté pour gérer un cas non standard que vous pourriez ou non avoir besoin de gérer.
Blixt

38

J'ai écrit une solution plus simple et élégante.

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];

Regardez cela, deux lignes, fait exactement ce qu'il dit sur l'étain - et ne se cassera pas si quelqu'un essaie de détecter des vulnérabilités et ajoute un tas de caractères et de requêtes supplémentaires contrairement à quelques-unes de ces solutions. A bientôt!
David G

Cela fait le travail correctement et uniquement en 2 lignes. Très bonne réponse!
Andres Ramos

Je pense que ce serait pratique pour les autres un chèque pour null a été inclus. Sinon, un exemple est ici: stackoverflow.com/a/36076822/1945948 (j'ai eu une tentative d'édition rejetée).
ATW

Je ne comprends pas ... comment cela répond-il à la question, qui concerne l'obtention de paramètres à partir d'une chaîne spécifique, 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5'?
mike rodent

J'ai adoré cette réponse, +1. Juste une suggestion, vous pouvez remplacer [0-9] pour\d
gmanjon

31

Une manière super simple d'utiliser URLSearchParams .

function getParam(param){
  return new URLSearchParams(window.location.search).get(param);
}

Il est actuellement pris en charge dans Chrome, Firefox, Safari, Edge et autres .


Obtenez l'erreur: «SCRIPT5009:« URLSearchParams »n'est pas défini» lors de l'exécution dans Edge.
Andreas Presthammer

@AndreasPresthammer Quelle version de edge?
spencer.sm

@ spencer-sm Microsoft Edge 41.16299.820.0
Andreas Presthammer

Ne fonctionne pas avec les paramètres d'URL prettifiés
ii iml0sto1

@ iiiml0sto1 Que sont les "paramètres d'URL prettifiés"?
spencer.sm

30

Voici une solution récursive qui n'a pas de regex et a une mutation minimale (seul l'objet params est muté, ce qui, je pense, est inévitable dans JS).

C'est génial parce que:

  • Est récursif
  • Gère plusieurs paramètres du même nom
  • Traite bien les chaînes de paramètres mal formées (valeurs manquantes, etc.)
  • Ne se casse pas si '=' est dans la valeur
  • Effectue le décodage d'URL
  • Et enfin, c'est génial parce que ... argh !!!

Code:

var get_params = function(search_string) {

  var parse = function(params, pairs) {
    var pair = pairs[0];
    var parts = pair.split('=');
    var key = decodeURIComponent(parts[0]);
    var value = decodeURIComponent(parts.slice(1).join('='));

    // Handle multiple parameters of the same name
    if (typeof params[key] === "undefined") {
      params[key] = value;
    } else {
      params[key] = [].concat(params[key], value);
    }

    return pairs.length == 1 ? params : parse(params, pairs.slice(1))
  }

  // Get rid of leading ?
  return search_string.length == 0 ? {} : parse({}, search_string.substr(1).split('&'));
}

var params = get_params(location.search);

// Finally, to get the param you want
params['c'];

31
Vous ... vous avez dit récursif deux fois.
Dissident Rage

Il ne peut pas trouver le premier paramètre dans la prochaine URL: www.mysite.com?first=1&second=2
Mario Radomanana

Bonjour Mario, voici un JSFiddle montrant qu'il fonctionne avec cette URL: jsfiddle.net/q6xfJ - Si vous avez trouvé une erreur, est-ce peut-être spécifique au navigateur? Lors des tests, veuillez noter que la réponse que j'ai fournie utilise location.search, qui est la partie «? First = 1 & second = 2» de l'URL. Santé :)
Jai

45
Je ne vois pas pourquoi quelque chose est bon simplement parce qu'il est récursif.
Adam Arold

6
Euh, je pense que vous avez manqué la plaisanterie récursive là-bas Adam. Bien que maintenant tout le monde va le manquer car edi9999 a supprimé le deuxième "est récursif".
Jai

27

J'ai créé une fonction qui fait ceci:

var getUrlParams = function (url) {
  var params = {};
  (url + '?').split('?')[1].split('&').forEach(function (pair) {
    pair = (pair + '=').split('=').map(decodeURIComponent);
    if (pair[0].length) {
      params[pair[0]] = pair[1];
    }
  });
  return params;
};

Mise à jour 5/26/2017, voici une implémentation ES7 (s'exécute avec babel preset stage 0, 1, 2 ou 3):

const getUrlParams = url => `${url}?`.split('?')[1]
  .split('&').reduce((params, pair) =>
    ((key, val) => key ? {...params, [key]: val} : params)
    (...`${pair}=`.split('=').map(decodeURIComponent)), {});

Quelques tests:

console.log(getUrlParams('https://google.com/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('https://google.com/')); // Will log {}
console.log(getUrlParams('a=1&b=2&c')); // Will log {}

Mise à jour 26/03/2018, voici une implémentation de Typographie:

const getUrlParams = (search: string) => `${search}?`
  .split('?')[1]
  .split('&')
  .reduce(
    (params: object, pair: string) => {
      const [key, value] = `${pair}=`
        .split('=')
        .map(decodeURIComponent)

      return key.length > 0 ? { ...params, [key]: value } : params
    },
    {}
  )

Mise à jour du 13/02/2019, voici une implémentation mise à jour de TypeScript qui fonctionne avec TypeScript 3.

interface IParams { [key: string]: string }

const paramReducer = (params: IParams, pair: string): IParams => {
  const [key, value] = `${pair}=`.split('=').map(decodeURIComponent)

  return key.length > 0 ? { ...params, [key]: value } : params
}

const getUrlParams = (search: string): IParams =>
  `${search}?`.split('?')[1].split('&').reduce<IParams>(paramReducer, {})

Sur une URL sans paramètres de requête, cela reviendraObject {"": ""}
Ilya Semenov

2
Ça me semble assez propre. Les autres réponses sont tout simplement trop «magiques» sans suffisamment d'explications.
Levi Roberts

Ceci est une réponse impressionnante!
Spencer Bigum

Merci @SpencerBigum!
Nate Ferrero

24

Regarde ça

function getURLParameters(paramName)
{
    var sURL = window.document.URL.toString();
    if (sURL.indexOf("?") > 0)
    {
        var arrParams = sURL.split("?");
        var arrURLParams = arrParams[1].split("&");
        var arrParamNames = new Array(arrURLParams.length);
        var arrParamValues = new Array(arrURLParams.length);

        var i = 0;
        for (i = 0; i<arrURLParams.length; i++)
        {
            var sParam =  arrURLParams[i].split("=");
            arrParamNames[i] = sParam[0];
            if (sParam[1] != "")
                arrParamValues[i] = unescape(sParam[1]);
            else
                arrParamValues[i] = "No Value";
        }

        for (i=0; i<arrURLParams.length; i++)
        {
            if (arrParamNames[i] == paramName)
            {
                //alert("Parameter:" + arrParamValues[i]);
                return arrParamValues[i];
            }
        }
        return "No Parameters Found";
    }
}

1
Merci. Je suis nouveau sur jscript et ce sera très utile.
Brian B.12

20

Solution ECMAScript 6:

var params = window.location.search
  .substring(1)
  .split("&")
  .map(v => v.split("="))
  .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())

Agréable. Pour info, parce que c'est une carte, l'utilisation est params.get ("clé");
evanmcd

Je l'aime mais il n'obtiendra probablement pas le premier paramètre. J'ai créé une fonction basée sur votre exemple function urlParams(url) { const [, searchParams = ''] = url.split('?') return searchParams.split('&') .map(v => v.split('=')) .reduce((map, [key = '', value]) => key.length ? map.set(key, decodeURIComponent(value)) : map, new Map()) }
mah.cr

11

j'utilise

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}

Veuillez ajouter quelques explications. Votre réponse est actuellement signalée comme "de faible qualité" et pourrait éventuellement être supprimée sans.
Johannes Jander

J'ai trouvé que s'il y avait une chaîne comme '#id' à la fin de l'URL, et renvoyais la dernière valeur de paramètre comme 'somevalue # id'
Ayano

@Ayano n'inclura window.location.searchpas de hachage comme #id.
Fancyoung

@Fancyoung Oui, vous avez raison, j'ai fait une erreur qui utilise location.hrefpour faire correspondre le résultat au lieu du location.search.Merci.
Ayano

11

J'utilise la bibliothèque parseUri . Il vous permet de faire exactement ce que vous demandez:

var uri = 'www.test.com/t.html&a=1&b=3&c=m2-m3-m4-m5';
var c = uri.queryKey['c'];
// c = 'm2-m3-m4-m5'

9

Voici ma solution. Comme conseillé par Andy E en répondant à cette question , ce n'est pas bon pour les performances de votre script s'il construit à plusieurs reprises différentes chaînes d'expression régulière, exécute des boucles, etc. juste pour obtenir une valeur unique. Donc, j'ai trouvé un script plus simple qui renvoie tous les paramètres GET dans un seul objet. Vous ne devez l'appeler qu'une seule fois, affecter le résultat à une variable puis, à tout moment dans le futur, obtenir la valeur souhaitée de cette variable à l'aide de la clé appropriée. Notez qu'il prend également en charge le décodage URI (c'est-à-dire des choses comme% 20) et remplace + par un espace:

 function getUrlQueryParams(url) {
  var queryString = url.split("?")[1];
  var keyValuePairs = queryString.split("&");
  var keyValue = [];
  var queryParams = {};
  keyValuePairs.forEach(function(pair) {
    keyValue = pair.split("=");
    queryParams[keyValue[0]] = decodeURIComponent(keyValue[1]).replace(/\+/g, " ");
});
  return queryParams;
}

Voici donc quelques tests du script à voir:

// Query parameters with strings only, no special characters.
var currentParams = getUrlQueryParams("example.com/foo?number=zero");
alert(currentParams["number"]); // Gives "zero".

// For the URL you stated above...
var someParams = getUrlQueryParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 ");
alert(someParams["c"]); // Gives "m2-m3-m4-m5".

// For a query params with URI encoding...
var someParams = getUrlQueryParams("www.example.com/t.html?phrase=a%20long%20shot&location=Silicon+Valley%2C+USA");
alert(someParams["phrase"]); // Gives "a long shot".
alert(someParams["location"]); // Gives "Silicon Valley, USA".

.replace ("+", "") ne remplacera que la première occurrence. Vous devez utiliser .replace (/ \ + / g, "");
Tony

8

Ou si vous ne voulez pas réinventer la roue d'analyse d'URI, utilisez URI.js

Pour obtenir la valeur d'un paramètre nommé foo:

new URI((''+document.location)).search(true).foo

Qu'est-ce que cela fait

  1. Convertir document.location en chaîne (c'est un objet)
  2. Alimentez cette chaîne au constructeur de classe URI URI.js
  3. Appelez la fonction search () pour obtenir la partie recherche (requête) de l'url
    (passer true lui indique de sortir un objet)
  4. Accédez à la propriété foo sur l'objet résultant pour obtenir la valeur

Voici un violon pour cela .... http://jsfiddle.net/m6tett01/12/


8

Pour une valeur de paramètre unique comme celle-ci, index.html? Msg = 1, utilisez le code suivant,

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search.substring(1);
    var varArray = queryString.split("="); //eg. index.html?msg=1

    var param1 = varArray[0];
    var param2 = varArray[1];

}

Pour toutes les valeurs de paramètre, utilisez le code suivant,

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search;
    var varArray = queryString.split("&");
    for (var i=0;i<varArray.length;i++) {
      var param = varArray[i].split("=");
        //parameter-value pair
    }
} 

1
J'aime cette solution!
alemur

8

Ici, je poste un exemple. Mais c'est dans jQuery. J'espère que cela aidera les autres:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990-->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')          // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')   // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});
</script>

1
Copié de votre autre article: "Nécessite le plugin url: plugins.jquery.com/url"
zeta

8

Le chemin le plus court:

new URL(location.href).searchParams.get("my_key");

2
Je préférerais utiliser new URL(location.href).searchParams.get("my_key")over URLSearchParamscar ce dernier échouera lors de la récupération du premier paramètre de requête d'une URL.
Travis Clarke

1
Testé les deux variantes. Je suis d'accord avec toi. Modifié la réponse.
Zon

7

cette question a trop de réponses, donc j'en ajoute une autre.

/**
 * parses and returns URI query parameters 
 * 
 * @param {string} param parm
 * @param {bool?} asArray if true, returns an array instead of a scalar 
 * @returns {Object|Array} 
 */
function getURIParameter(param, asArray) {
    return document.location.search.substring(1).split('&').reduce(function(p,c) {
        var parts = c.split('=', 2).map(function(param) { return decodeURIComponent(param); });
        if(parts.length == 0 || parts[0] != param) return (p instanceof Array) && !asArray ? null : p;
        return asArray ? p.concat(parts.concat(true)[1]) : parts.concat(true)[1];
    }, []);
}

usage:

getURIParameter("id")  // returns the last id or null if not present
getURIParameter("id", true) // returns an array of all ids

cela permet de gérer les paramètres vides (les clés présentes sans "=value"), l'exposition à la fois d'une API de récupération de valeurs scalaire et basée sur un tableau, ainsi que le décodage des composants URI appropriés.


7

La façon la plus simple d'utiliser la replace()méthode:

De la urlStrchaîne:

paramVal = urlStr.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

ou à partir de l' URL actuelle :

paramVal = document.URL.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

Explication:

  • document.URL - l'interface renvoie l'emplacement du document (URL de la page) sous forme de chaîne.
  • replace()- La méthode renvoie une nouvelle chaîne avec certaines ou toutes les correspondances d'un modèle remplacées par un remplacement .
  • /.*param_name=([^&]*).*/- le modèle d' expression régulière entouré de barres obliques, ce qui signifie:
    • .* - zéro ou plusieurs caractères,
    • param_name= - nom du param qui est desséché,
    • () - groupe en expression régulière,
    • [^&]* - un ou plusieurs caractères quelconques à l'exclusion & ,
    • | - alternance,
    • $1 - référence au premier groupe dans l'expression régulière.

var urlStr = 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5';
var c = urlStr.replace(/.*c=([^&]*).*|(.*)/, '$1');
var notExisted = urlStr.replace(/.*not_existed=([^&]*).*|(.*)/, '$1');
console.log(`c === '${c}'`);
console.log(`notExisted === '${notExisted}'`);


1
Belle solution, mais si le paramètre n'est pas trouvé, la chaîne entière est retournée. Je m'attendrais à "non défini" dans ce cas.
pensan

1
Bonjour @pensan, merci pour ton excellent commentaire. J'ajoute simplement à l'expression régulière la gestion de la situation lorsque le paramètre n'apparaît pas dans l'URL. Dans ce cas, nous obtenons la chaîne emty (pas la chaîne entière).
simhumileco

6

Encore une autre suggestion.

Il y a déjà de bonnes réponses, mais je les ai trouvées inutilement complexes et difficiles à comprendre. C'est court, simple et renvoie un tableau associatif simple avec des noms de clé correspondant aux noms de jeton dans l'URL.

J'ai ajouté une version avec des commentaires ci-dessous pour ceux qui veulent apprendre.

Notez que cela repose sur jQuery ($ .each) pour sa boucle, que je recommande au lieu de forEach. Je trouve plus simple de garantir la compatibilité entre les navigateurs en utilisant jQuery sur toute la ligne plutôt que de brancher des correctifs individuels pour prendre en charge les nouvelles fonctions qui ne sont pas prises en charge dans les anciens navigateurs.

Edit: Après avoir écrit cela, j'ai remarqué la réponse d'Eric Elliott, qui est presque la même, bien qu'elle utilise forEach, alors que je suis généralement contre (pour les raisons énoncées ci-dessus).

function getTokens(){
    var tokens = [];
    var query = location.search;
    query = query.slice(1);
    query = query.split('&');
    $.each(query, function(i,value){    
        var token = value.split('=');   
        var key = decodeURIComponent(token[0]);     
        var data = decodeURIComponent(token[1]);
        tokens[key] = data;
    });
    return tokens;
}

Version commentée:

function getTokens(){
    var tokens = [];            // new array to hold result
    var query = location.search; // everything from the '?' onward 
    query = query.slice(1);     // remove the first character, which will be the '?' 
    query = query.split('&');   // split via each '&', leaving us an array of something=something strings

    // iterate through each something=something string
    $.each(query, function(i,value){    

        // split the something=something string via '=', creating an array containing the token name and data
        var token = value.split('=');   

        // assign the first array element (the token name) to the 'key' variable
        var key = decodeURIComponent(token[0]);     

        // assign the second array element (the token data) to the 'data' variable
        var data = decodeURIComponent(token[1]);

        tokens[key] = data;     // add an associative key/data pair to our result array, with key names being the URI token names
    });

    return tokens;  // return the array
}

Pour les exemples ci-dessous, nous supposerons cette adresse:

http://www.example.com/page.htm?id=4&name=murray

Vous pouvez attribuer les jetons URL à votre propre variable:

var tokens = getTokens();

Référez-vous ensuite à chaque jeton d'URL par nom comme ceci:

document.write( tokens['id'] );

Cela afficherait "4".

Vous pouvez également simplement vous référer directement à un nom de jeton à partir de la fonction:

document.write( getTokens()['name'] );

... qui imprimerait "murray".


6
// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

// Usage for URL: http://my.site.com/location?locationId=53cc272c0364aefcb78756cd&shared=false
var id = getUrlVars()["locationId"];

A partir d'ici: http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html


6

Manière simple

function getParams(url){
        var regex = /[?&]([^=#]+)=([^&#]*)/g,
            params = {},
            match;
        while(match = regex.exec(url)) {
            params[match[1]] = match[2];
        }
        return params;
    }

puis appelez-le comme getParams (url)


5

J'avais besoin de lire une variable URL GET et de terminer une action basée sur le paramètre url. J'ai cherché haut et bas une solution et suis tombé sur ce petit morceau de code. Il lit essentiellement l'URL de la page actuelle, effectue une expression régulière sur l'URL puis enregistre les paramètres d'URL dans un tableau associatif, auquel nous pouvons facilement accéder.

Donc, à titre d'exemple, si nous avions l'URL suivante avec le javascript en bas en place.

http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July

Tout ce que nous aurions besoin de faire pour obtenir l'ID et la page des paramètres est d'appeler ceci:

Le code sera:

<script type="text/javascript">
var first = getUrlVars()["year"];
var second = getUrlVars()["Month"];

alert(first);
alert(second);
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>

Travaillé pour moi merci
OJB1

5
// http:localhost:8080/path?param_1=a&param_2=b
var getParamsMap = function () {
    var params = window.location.search.split("&");
    var paramsMap = {};
    params.forEach(function (p) {
        var v = p.split("=");
        paramsMap[v[0]]=decodeURIComponent(v[1]);
    });
    return paramsMap;
};

// -----------------------

console.log(getParamsMap()["param_1"]);  // should log "a"     

Cela renvoie le premier paramètre avec '?'
Pini Cheyni

5

Ce Gist par Eldon McGuinness est de loin l'implémentation la plus complète d'un analyseur de chaînes de requête JavaScript que j'ai vue jusqu'à présent.

Malheureusement, il est écrit en tant que plugin jQuery.

Je l'ai réécrit sur vanilla JS et j'ai apporté quelques améliorations:

function parseQuery(str) {
  var qso = {};
  var qs = (str || document.location.search);
  // Check for an empty querystring
  if (qs == "") {
    return qso;
  }
  // Normalize the querystring
  qs = qs.replace(/(^\?)/, '').replace(/;/g, '&');
  while (qs.indexOf("&&") != -1) {
    qs = qs.replace(/&&/g, '&');
  }
  qs = qs.replace(/([\&]+$)/, '');
  // Break the querystring into parts
  qs = qs.split("&");
  // Build the querystring object
  for (var i = 0; i < qs.length; i++) {
    var qi = qs[i].split("=");
    qi = qi.map(function(n) {
      return decodeURIComponent(n)
    });
    if (typeof qi[1] === "undefined") {
      qi[1] = null;
    }
    if (typeof qso[qi[0]] !== "undefined") {

      // If a key already exists then make this an object
      if (typeof (qso[qi[0]]) == "string") {
        var temp = qso[qi[0]];
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]] = [];
        qso[qi[0]].push(temp);
        qso[qi[0]].push(qi[1]);

      } else if (typeof (qso[qi[0]]) == "object") {
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]].push(qi[1]);
      }
    } else {
      // If no key exists just set it as a string
      if (qi[1] == "") {
        qi[1] = null;
      }
      qso[qi[0]] = qi[1];
    }
  }
  return qso;
}

// DEMO
console.log(parseQuery("?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab"));

Voir aussi ce violon .


Ce que je ne comprends pas à propos de javascript, c'est pourquoi n'ont-ils pas créé et mis des fonctions d'analyse d'url dans le langage lui-même ou au moins dans une bibliothèque de normes? Les choses de bas niveau ne devraient pas être réinventées encore et encore, ni laissées aux développeurs d'utiliser les solutions de variantes entropiques qu'ils élaboreront. Si c'est solide, quelque chose comme ça devrait être fait dans la bibliothèque standard. Ceci est un exemple du type de chose en javascript qui me désactive la langue.
ahnbizcad

5

Solution de style élégante et fonctionnelle

Créons un objet contenant des noms de paramètres d'URL sous forme de clés, puis nous pouvons facilement extraire le paramètre par son nom:

// URL: https://example.com/?test=true&orderId=9381  

// Build an object containing key-value pairs
export const queryStringParams = window.location.search
  .split('?')[1]
  .split('&')
  .map(keyValue => keyValue.split('='))
  .reduce<QueryStringParams>((params, [key, value]) => {
    params[key] = value;
    return params;
  }, {});

type QueryStringParams = {
  [key: string]: string;
};


// Return URL parameter called "orderId"
return queryStringParams.orderId;

j'aime ça, mais n'a pas fonctionné pour moi sans être sûr de retourner l'accumulateur dans la fonction de réduction
Ella

@Ella c'était une faute de frappe, il n'y a aucun moyen que cela puisse fonctionner sansreturn

Semble mieux maintenant, espérons que vous arriverez à la première page!
Ella

4

Voici ce que je fais:

var uriParams = getSearchParameters();
alert(uriParams.c);


// background functions:

// Get object/associative array of URL parameters
function getSearchParameters () {
  var prmstr = window.location.search.substr(1);
  return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {};
}

// convert parameters from url-style string to associative array
function transformToAssocArray (prmstr) {
  var params = {},
      prmarr = prmstr.split("&");

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.