it-swarm.dev

Como posso obter valores de string de consulta em JavaScript?

Existe uma maneira sem plugin de recuperar string de consulta valores via jQuery (ou sem)?

Se sim, como? Se não, existe um plugin que pode fazer isso?

2701
Kemal Emin

Atualização: set-2018

Você pode usar URLSearchParams que é simples e tem bom suporte ao navegador .

const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');

Original

Você não precisa do jQuery para esse propósito. Você pode usar apenas algum JavaScript puro:

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, '\\$&');
    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
}

Uso:

// query string: ?foo=lorem&bar=&baz
var foo = getParameterByName('foo'); // "lorem"
var bar = getParameterByName('bar'); // "" (present with empty value)
var baz = getParameterByName('baz'); // "" (present with no value)
var qux = getParameterByName('qux'); // null (absent)


Nota: Se um parâmetro estiver presente várias vezes (?foo=lorem&foo=ipsum), você obterá o primeiro valor (lorem). Não há nenhum padrão sobre isso e os usos variam, veja, por exemplo, esta questão: Posição autoritativa de chaves de consulta HTTP GET duplicadas .
NOTA: A função faz distinção entre maiúsculas e minúsculas. Se você preferir o nome do parâmetro sem distinção entre maiúsculas e minúsculas, adicione o modificador 'i' ao RegExp


Esta é uma atualização baseada nas novas especificações URLSearchParams para alcançar o mesmo resultado de forma mais sucinta. Veja a resposta intitulada " URLSearchParams " abaixo.

7640
Artem Barger

Algumas das soluções postadas aqui são ineficientes. Repetir a pesquisa de expressão regular toda vez que o script precisa acessar um parâmetro é completamente desnecessário, uma única função para dividir os parâmetros em um objeto de estilo de matriz associativa é suficiente. Se você não estiver trabalhando com a API de histórico do HTML 5, isso será necessário apenas uma vez por carregamento de página. As outras sugestões aqui também não conseguem decodificar a URL corretamente.

var urlParams;
(window.onpopstate = function () {
    var match,
        pl     = /\+/g,  // Regex for replacing addition symbol with a space
        search = /([^&=]+)=?([^&]*)/g,
        decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
        query  = window.location.search.substring(1);

    urlParams = {};
    while (match = search.exec(query))
       urlParams[decode(match[1])] = decode(match[2]);
})();

Exemplo de querystring:

?i=main&mode=front&sid=de8d49b78a85a322c4155015fdce22c4&enc=+Hello%20&empty

Resultado:

 urlParams = {
    enc: " Hello ",
    i: "main",
    mode: "front",
    sid: "de8d49b78a85a322c4155015fdce22c4",
    empty: ""
}

alert(urlParams["mode"]);
// -> "front"

alert("empty" in urlParams);
// -> true

Isso poderia facilmente ser melhorado para manipular seqüências de consulta de estilo de matriz também. Um exemplo disso é aqui , mas como os parâmetros do estilo array não estão definidos em RFC 3986 não vou poluir esta resposta com o código fonte. Para aqueles interessados ​​em uma versão "poluída", veja a resposta de campbeln abaixo .

Além disso, como apontado nos comentários, ; é um delimitador legal para os pares key=value. Seria necessário um regex mais complicado para lidar com ; ou &, o que eu acho que é desnecessário porque é raro que ; seja usado e eu diria ainda mais improvável que ambos sejam usados. Se você precisar dar suporte a ; em vez de &, apenas troque-os na regex.


<script>var urlParams = <?php echo json_encode($_GET, JSON_HEX_TAG);?>;</script>

Muito mais simples!

1666
Andy E

ES2015 (ES6)

getQueryStringParams = query => {
    return query
        ? (/^[?#]/.test(query) ? query.slice(1) : query)
            .split('&')
            .reduce((params, param) => {
                    let [key, value] = param.split('=');
                    params[key] = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : '';
                    return params;
                }, {}
            )
        : {}
};

Sem jQuery

var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length; ++i)
    {
        var p=a[i].split('=', 2);
        if (p.length == 1)
            b[p[0]] = "";
        else
            b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
    }
    return b;
})(window.location.search.substr(1).split('&'));

Com um URL como ?topic=123&name=query+string, o seguinte retornará:

qs["topic"];    // 123
qs["name"];     // query string
qs["nothere"];  // undefined (object)

Método do Google

Rasgando o código do Google, encontrei o método que eles usam: getUrlParameters

function (b) {
    var c = typeof b === "undefined";
    if (a !== h && c) return a;
    for (var d = {}, b = b || k[B][vb], e = b[p]("?"), f = b[p]("#"), b = (f === -1 ? b[Ya](e + 1) : [b[Ya](e + 1, f - e - 1), "&", b[Ya](f + 1)][K](""))[z]("&"), e = i.dd ? ia : unescape, f = 0, g = b[w]; f < g; ++f) {
        var l = b[f][p]("=");
        if (l !== -1) {
            var q = b[f][I](0, l),
                l = b[f][I](l + 1),
                l = l[Ca](/\+/g, " ");
            try {
                d[q] = e(l)
            } catch (A) {}
        }
    }
    c && (a = d);
    return d
}

É ofuscado, mas é compreensível. Não funciona porque algumas variáveis ​​são indefinidas.

Eles começam a procurar parâmetros no URL de ? e também a partir do hash #. Então, para cada parâmetro que eles dividem no sinal de igual b[f][p]("=") (que se parece com indexOf, eles usam a posição do caractere para obter a chave/valor). Ao dividi-los, eles verificam se o parâmetro tem um valor ou não, se eles armazenam o valor de d, caso contrário, eles continuam.

No final, o objeto d é retornado, tratando de escape e o sinal +. Este objeto é como o meu, tem o mesmo comportamento.


Meu método como plugin jQuery

(function($) {
    $.QueryString = (function(paramsArray) {
        let params = {};

        for (let i = 0; i < paramsArray.length; ++i)
        {
            let param = paramsArray[i]
                .split('=', 2);

            if (param.length !== 2)
                continue;

            params[param[0]] = decodeURIComponent(param[1].replace(/\+/g, " "));
        }

        return params;
    })(window.location.search.substr(1).split('&'))
})(jQuery);

Uso

//Get a param
$.QueryString.param
//-or-
$.QueryString["param"]
//This outputs something like...
//"val"

//Get all params as object
$.QueryString
//This outputs something like...
//Object { param: "val", param2: "val" }

//Set a param (only in the $.QueryString object, doesn't affect the browser's querystring)
$.QueryString.param = "newvalue"
//This doesn't output anything, it just updates the $.QueryString object

//Convert object into string suitable for url a querystring (Requires jQuery)
$.param($.QueryString)
//This outputs something like...
//"param=newvalue&param2=val"

//Update the url/querystring in the browser's location bar with the $.QueryString object
history.replaceState({}, '', "?" + $.param($.QueryString));
//-or-
history.pushState({}, '', "?" + $.param($.QueryString));

Teste de desempenho (método dividido contra o método regex) ( jsPerf )

Código de preparação: declaração de métodos

Código de teste dividido

var qs = window.GetQueryString(query);

var search = qs["q"];
var value = qs["value"];
var undef = qs["undefinedstring"];

Código de teste Regex

var search = window.getParameterByName("q");
var value = window.getParameterByName("value");
var undef = window.getParameterByName("undefinedstring");

Testando no Firefox 4.0 x86 no Windows Server 2008 R2/7 x64

  • Split method: 144,780 ± 2.17% mais rápido
  • Método Regex​​_: 13.881 ± 0.85% | 90% mais lento
1244
BrunoLM

Versão melhorada de Resposta de Artem Barger :

function getParameterByName(name) {
    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}

Para mais informações sobre melhorias, consulte: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/

650
James

URLSearchParams

O Firefox 44+, o Opera 36+, o Edge 17+, o Safari 10.3+ e o Chrome 49+ suportam o URLSearchParams API:

Há um polyfillURLSearchParams sugerido pelo googlepara as versões estáveis ​​do IE.

Não é padronizado por W3C , mas é um padrão de vida por WhatWG .

Você pode usá-lo no local, mas precisa remover o ponto de interrogação ? (por exemplo, com .slice(1)):

let params = new URLSearchParams(location.search);

ou

let params = (new URL(location)).searchParams;

Ou, claro, em qualquer URL:

let url = new URL('https://example.com?foo=1&bar=2');
let params = new URLSearchParams(url.search);

Você também pode obter params usando uma propriedade abreviada .searchParams no objeto URL, desta forma:

let params = new URL('https://example.com?foo=1&bar=2').searchParams;
params.get('foo'); // "1"
params.get('bar'); // "2" 

Você lê/define parâmetros através da API get(KEY), set(KEY, VALUE), append(KEY, VALUE). Você também pode iterar todos os valores for (let p of params) {}.

A implementação de referência e uma página de amostra estão disponíveis para auditoria e teste.

541
Paul Sweatte

Apenas outra recomendação. O pluginPurlpermite recuperar todas as partes do URL, incluindo âncora, Host, etc.

Pode ser usado com ou sem jQuery.

O uso é muito simples e legal:

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value'); // jQuery version
var url = purl('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

No entanto, a partir de 11 de novembro de 2014, o Purl não é mais mantido e o autor recomenda usar URI.js em vez disso. O plugin jQuery é diferente porque se concentra em elementos - para uso com strings, basta usar URI diretamente, com ou sem jQuery. Código semelhante ficaria assim, fuller docs aqui :

var url = new URI('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.protocol(); // returns 'http'
url.path(); // returns '/folder/dir/index.html'
398
AlfaTeK

tl; dr

Uma solução rápida, completa , que lida com chaves de valores múltiplos e caracteres codificados .

var qd = {};
if (location.search) location.search.substr(1).split("&").forEach(function(item) {var s = item.split("="), k = s[0], v = s[1] && decodeURIComponent(s[1]); (qd[k] = qd[k] || []).Push(v)})

//using ES6   (23 characters cooler)
var qd = {};
if (location.search) location.search.substr(1).split`&`.forEach(item => {let [k,v] = item.split`=`; v = v && decodeURIComponent(v); (qd[k] = qd[k] || []).Push(v)})
var qd = {};
if (location.search) location.search.substr(1).split("&").forEach(function(item) {
    var s = item.split("="),
        k = s[0],
        v = s[1] && decodeURIComponent(s[1]); //  null-coalescing / short-circuit
    //(k in qd) ? qd[k].Push(v) : qd[k] = [v]
    (qd[k] = qd[k] || []).Push(v) // null-coalescing / short-circuit
})

O que é todo esse código ...
"coalescência nula" , avaliação de curto-circuito
ES6 Atribuições de destruição , Funções de seta , Sequências de caracteres

"?a=1&b=0&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"
> qd
a: ["1", "5", "t e x t"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

> qd.a[1]    // "5"
> qd["a"][1] // "5"



Leia mais ... sobre a solução JavaScript Vanilla.

Para acessar diferentes partes de um URL use location.(search|hash)

Solução mais fácil (fictícia)

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
  • Alças chaves vazias corretamente.
  • Substitui multi-chaves com último valor encontrado.
"?a=1&b=0&c=3&d&e&a=5"
> queryDict
a: "5"
b: "0"
c: "3"
d: undefined
e: undefined

Chaves de múltiplos valores

Verificação de chave simples (item in dict) ? dict.item.Push(val) : dict.item = [val]

var qd = {};
location.search.substr(1).split("&").forEach(function(item) {(item.split("=")[0] in qd) ? qd[item.split("=")[0]].Push(item.split("=")[1]) : qd[item.split("=")[0]] = [item.split("=")[1]]})
  • Agora retorna matrizes em vez de.
  • Valores de acesso por qd.key[index] ou qd[key][index]
> qd
a: ["1", "5"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined]

Caracteres codificados?

Use decodeURIComponent() para o segundo ou ambos splits.

var qd = {};
location.search.substr(1).split("&").forEach(function(item) {var k = item.split("=")[0], v = decodeURIComponent(item.split("=")[1]); (k in qd) ? qd[k].Push(v) : qd[k] = [v]})
"?a=1&b=0&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"
> qd
a: ["1", "5", "t e x t"]
b: ["0"]
c: ["3"]
d: ["undefined"]  // decodeURIComponent(undefined) returns "undefined" !!!*
e: ["undefined", "http://w3schools.com/my test.asp?name=ståle&car=saab"]



Dos comentários

* !!! Por favor, note que decodeURIComponent(undefined) retorna string "undefined". A solução está no uso simples de && , que garante que decodeURIComponent() não seja chamado em valores indefinidos. (Veja a "solução completa" no topo.)

v = v && decodeURIComponent(v);


Se a querystring estiver vazia (location.search == ""), o resultado é um tanto enganador qd == {"": undefined}. Sugere-se para verificar a querystring antes de iniciar a função de análise likeso:

if (location.search) location.search.substr(1).split("&").forEach(...)
231
Qwerty

Roshambo no snipplr.com tem um script simples para conseguir isso descrito emObter parâmetros de URL com jQuery | Melhorado. Com o seu script, você também pode extrair apenas os parâmetros desejados.

Aqui está o Gist:

$.urlParam = function(name, url) {
    if (!url) {
     url = window.location.href;
    }
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(url);
    if (!results) { 
        return undefined;
    }
    return results[1] || undefined;
}

Então é só pegar seus parâmetros da string de consulta.

Então, se a string de URL/consulta for xyz.com/index.html?lang=de.

Apenas chame var langval = $.urlParam('lang'); e você conseguiu.

UZBEKJON tem um ótimo post sobre isso também,Obtenha parâmetros e valores de URL com jQuery.

216
brandonjp

Se você estiver usando o jQuery, poderá usar uma biblioteca, como jQuery BBQ: Back Button & Query Library .

... O jQuery BBQ fornece um método .deparam() completo, juntamente com o gerenciamento de estado de hash e os métodos de utilitário de fusão e mesclagem de fragmentos/consultas.

Editar: Adicionando Deparam Exemplo:

 var DeparamExample = function() {
            var params = $.deparam.querystring();

            //nameofparam is the name of a param from url
            //code below will get param if ajax refresh with hash
            if (typeof params.nameofparam == 'undefined') {
                params = jQuery.deparam.fragment(window.location.href);
            }
            
            if (typeof params.nameofparam != 'undefined') {
                var paramValue = params.nameofparam.toString();
                  
            }
        };

Se você quiser apenas usar JavaScript simples, você pode usar ...

var getParamValue = (function() {
    var params;
    var resetParams = function() {
            var query = window.location.search;
            var regex = /[?&;](.+?)=([^&;]+)/g;
            var match;

            params = {};

            if (query) {
                while (match = regex.exec(query)) {
                    params[match[1]] = decodeURIComponent(match[2]);
                }
            }    
        };

    window.addEventListener
    && window.addEventListener('popstate', resetParams);

    resetParams();

    return function(param) {
        return params.hasOwnProperty(param) ? params[param] : null;
    }

})();​

Por causa da nova API de histórico de HTML e especificamente history.pushState() e history.replaceState(), a URL pode alterar o que invalidará o cache de parâmetros e seus valores.

Esta versão atualizará seu cache interno de parâmetros sempre que o histórico for alterado.

165
alex

Apenas use dois splits :

function get(n) {
    var half = location.search.split(n + '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

Eu estava lendo todas as respostas anteriores e mais completas. Mas acho que esse é o método mais simples e rápido. Você pode verificar neste jsPerf benchmark

Para resolver o problema no comentário de Rup, adicione uma divisão condicional, alterando a primeira linha para as duas abaixo. Mas precisão absoluta significa que agora é mais lento que o regexp (consulte jsPerf ).

function get(n) {
    var half = location.search.split('&' + n + '=')[1];
    if (!half) half = location.search.split('?' + n + '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

Então, se você sabe que não vai encontrar o caso do Rup, isso vence. Caso contrário, regexp.

Or se você tiver controle da querystring e puder garantir que um valor que você está tentando obter nunca conterá caracteres codificados em URL (ter um valor em algo seria uma má ideia) - você pode usar o seguinte versão ligeiramente mais simplificada e legível da 1ª opção:

    function getQueryStringValueByName(name) {
        var queryStringFromStartOfValue = location.search.split(name + '=')[1];
         return queryStringFromStartOfValue !== undefined ? queryStringFromStartOfValue.split('&')[0] : null;
99
Martin Borthiry

Aqui está a minha tentativa de tornar a excelente solução do Andy E num plug-in jQuery completo:

;(function ($) {
    $.extend({      
        getQueryString: function (name) {           
            function parseParams() {
                var params = {},
                    e,
                    a = /\+/g,  // Regex for replacing addition symbol with a space
                    r = /([^&=]+)=?([^&]*)/g,
                    d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
                    q = window.location.search.substring(1);

                while (e = r.exec(q))
                    params[d(e[1])] = d(e[2]);

                return params;
            }

            if (!this.queryStringParams)
                this.queryStringParams = parseParams(); 

            return this.queryStringParams[name];
        }
    });
})(jQuery);

A sintaxe é:

var someVar = $.getQueryString('myParam');

Melhor dos dois mundos!

94
Ryan Phelan

Se você está fazendo mais manipulação de URL do que simplesmente analisando a querystring, você pode achar URI.js helpful. É uma biblioteca para manipular URLs - e vem com todos os sinos e assobios. (Desculpe por auto-publicidade aqui)

para converter sua querystring em um mapa:

var data = URI('?foo=bar&bar=baz&foo=world').query(true);
data == {
  "foo": ["bar", "world"],
  "bar": "baz"
}

(URI.js também "corrige" querystrings ruins como ?&foo&&bar=baz& para ?foo&bar=baz)

76
rodneyrehm

Eu gosto de a solução de Ryan Phelan . Mas eu não vejo nenhum ponto de estender o jQuery para isso? Não há uso da funcionalidade do jQuery.

Por outro lado, gosto da função incorporada no Google Chrome: window.location.getParameter.

Então, por que não usar isso? Ok, outros navegadores não têm. Então vamos criar essa função se ela não existir:

if (!window.location.getParameter ) {
  window.location.getParameter = function(key) {
    function parseParams() {
        var params = {},
            e,
            a = /\+/g,  // Regex for replacing addition symbol with a space
            r = /([^&=]+)=?([^&]*)/g,
            d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
            q = window.location.search.substring(1);

        while (e = r.exec(q))
            params[d(e[1])] = d(e[2]);

        return params;
    }

    if (!this.queryStringParams)
        this.queryStringParams = parseParams(); 

    return this.queryStringParams[key];
  };
}

Esta função é mais ou menos de Ryan Phelan, mas é empacotada de forma diferente: nome claro e sem dependências de outras bibliotecas javascript. Mais sobre esta função no meu blog .

59
Anatoly Mironov

Aqui está uma maneira rápida de obter um objeto semelhante ao PHP $ _GET array:

function get_query(){
    var url = location.search;
    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]] = decodeURIComponent(qs[i][1]);
    }
    return result;
}

Uso:

var $_GET = get_query();

Para a string de consulta x=5&y&z=hello&x=6, isso retorna o objeto:

{
  x: "6",
  y: undefined,
  z: "hello"
}
53
Paulpro

Mantenha-o simples em código JavaScript simples:

function qs(key) {
    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[key];
}

Chame de qualquer lugar no código JavaScript:

var result = qs('someKey');
52
Sagiv Ofek

Essas são todas ótimas respostas, mas eu precisava de algo um pouco mais robusto, e achei que todos vocês gostariam de ter o que eu criei.

É um método de biblioteca simples que faz dissecação e manipulação de parâmetros de URL. O método estático tem os seguintes sub métodos que podem ser chamados no URL do assunto:

  • getHost
  • getPath
  • getHash
  • setHash
  • getParams
  • getQuery
  • setParam
  • getParam
  • hasParam
  • removeParam

Exemplo:

URLParser(url).getParam('myparam1')

var url = "http://www.test.com/folder/mypage.html?myparam1=1&myparam2=2#something";

function URLParser(u){
    var path="",query="",hash="",params;
    if(u.indexOf("#") > 0){
        hash = u.substr(u.indexOf("#") + 1);
        u = u.substr(0 , u.indexOf("#"));
    }
    if(u.indexOf("?") > 0){
        path = u.substr(0 , u.indexOf("?"));
        query = u.substr(u.indexOf("?") + 1);
        params= query.split('&');
    }else
        path = u;
    return {
        getHost: function(){
            var hostexp = /\/\/([\w.-]*)/;
            var match = hostexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getPath: function(){
            var pathexp = /\/\/[\w.-]*(?:\/([^?]*))/;
            var match = pathexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getHash: function(){
            return hash;
        },
        getParams: function(){
            return params
        },
        getQuery: function(){
            return query;
        },
        setHash: function(value){
            if(query.length > 0)
                query = "?" + query;
            if(value.length > 0)
                query = query + "#" + value;
            return path + query;
        },
        setParam: function(name, value){
            if(!params){
                params= new Array();
            }
            params.Push(name + '=' + value);
            for (var i = 0; i < params.length; i++) {
                if(query.length > 0)
                    query += "&";
                query += params[i];
            }
            if(query.length > 0)
                query = "?" + query;
            if(hash.length > 0)
                query = query + "#" + hash;
            return path + query;
        },
        getParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return decodeURIComponent(pair[1]);
                }
            }
            console.log('Query variable %s not found', name);
        },
        hasParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return true;
                }
            }
            console.log('Query variable %s not found', name);
        },
        removeParam: function(name){
            query = "";
            if(params){
                var newparams = new Array();
                for (var i = 0;i < params.length;i++) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) != name)
                          newparams .Push(params[i]);
                }
                params = newparams;
                for (var i = 0; i < params.length; i++) {
                    if(query.length > 0)
                        query += "&";
                    query += params[i];
                }
            }
            if(query.length > 0)
                query = "?" + query;
            if(hash.length > 0)
                query = query + "#" + hash;
            return path + query;
        },
    }
}


document.write("Host: " + URLParser(url).getHost() + '<br>');
document.write("Path: " + URLParser(url).getPath() + '<br>');
document.write("Query: " + URLParser(url).getQuery() + '<br>');
document.write("Hash: " + URLParser(url).getHash() + '<br>');
document.write("Params Array: " + URLParser(url).getParams() + '<br>');
document.write("Param: " + URLParser(url).getParam('myparam1') + '<br>');
document.write("Has Param: " + URLParser(url).hasParam('myparam1') + '<br>');

document.write(url + '<br>');

// Remove the first parameter
url = URLParser(url).removeParam('myparam1');
document.write(url + ' - Remove the first parameter<br>');

// Add a third parameter
url = URLParser(url).setParam('myparam3',3);
document.write(url + ' - Add a third parameter<br>');

// Remove the second parameter
url = URLParser(url).removeParam('myparam2');
document.write(url + ' - Remove the second parameter<br>');

// Add a hash
url = URLParser(url).setHash('newhash');
document.write(url + ' - Set Hash<br>');

// Remove the last parameter
url = URLParser(url).removeParam('myparam3');
document.write(url + ' - Remove the last parameter<br>');

// Remove a parameter that doesn't exist
url = URLParser(url).removeParam('myparam3');
document.write(url + ' - Remove a parameter that doesn\"t exist<br>');
46
Bernesto

De o MDN :

function loadPageVar (sVar) {
  return unescape(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + escape(sVar).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));
}

alert(loadPageVar("name"));
43
orip

Eu uso muito expressões regulares, mas não para isso.

Parece-me mais fácil e mais eficiente ler a cadeia de consulta uma vez na minha aplicação e construir um objeto a partir de todos os pares chave/valor como:

var search = function() {
  var s = window.location.search.substr(1),
    p = s.split(/\&/), l = p.length, kv, r = {};
  if (l === 0) {return false;}
  while (l--) {
    kv = p[l].split(/\=/);
    r[kv[0]] = decodeURIComponent(kv[1] || '') || true;
  }
  return r;
}();

Para um URL como http://domain.com?param1=val1&param2=val2, você pode obter seu valor mais tarde em seu código como search.param1 e search.param2.

39
Mic

Code golf:

var a = location.search&&location.search.substr(1).replace(/\+/gi," ").split("&");
for (var i in a) {
    var s = a[i].split("=");
    a[i]  = a[unescape(s[0])] = unescape(s[1]);
}

Exibi-lo!

for (i in a) {
    document.write(i + ":" + a[i] + "<br/>");   
};

No meu Mac: test.htm?i=can&has=cheezburger exibe

0:can
1:cheezburger
i:can
has:cheezburger
39
shanimal

Roshambo jQuery método não estava cuidando de decodificação URL

http://snipplr.com/view/26662/get-url-parameters-with-jquery--improved/

Acabei de adicionar essa capacidade também ao adicionar a declaração de retorno

return decodeURIComponent(results[1].replace(/\+/g, " ")) || 0;

Agora você pode encontrar o Gist atualizado:

$.urlParam = function(name){
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
if (!results) { return 0; }
return decodeURIComponent(results[1].replace(/\+/g, " ")) || 0;
}
38
Mohammad Arif
function GET() {
        var data = [];
        for(x = 0; x < arguments.length; ++x)
            data.Push(location.href.match(new RegExp("/\?".concat(arguments[x],"=","([^\n&]*)")))[1])
                return data;
    }


example:
data = GET("id","name","foo");
query string : ?id=3&name=jet&foo=b
returns:
    data[0] // 3
    data[1] // jet
    data[2] // b
or
    alert(GET("id")[0]) // return 3
38
Jet

Eu gosto de este (tirado de jquery-how to.blogspot.co.uk):

// get an array with all querystring values
// example: var valor = getUrlVars()["valor"];
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;
}

Funciona muito bem para mim.

36
Tomamais

Aqui está minha edição para esta excelente resposta - com a capacidade adicional de analisar strings de consulta com chaves sem valores.

var url = 'http://sb.com/reg/step1?param';
var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length; ++i) {
        var p=a[i].split('=', 2);
        if (p[1]) p[1] = decodeURIComponent(p[1].replace(/\+/g, " "));
        b[p[0]] = p[1];
    }
    return b;
})((url.split('?'))[1].split('&'));

IMPORTANTE! O parâmetro para essa função na última linha é diferente. É apenas um exemplo de como alguém pode passar um URL arbitrário para ele. Você pode usar a última linha da resposta de Bruno para analisar o URL atual.

Então, o que exatamente mudou? Com url http://sb.com/reg/step1?param= os resultados serão os mesmos. Mas com url http://sb.com/reg/step1?param a solução de Bruno retorna um objeto sem chaves, enquanto o meu retorna um objeto com o valor de chave param e undefined.

36
skaurus

Eu precisava de um objeto da string de consulta e detesto muito código. Pode não ser o mais robusto do universo, mas são apenas algumas linhas de código.

var q = {};
location.href.split('?')[1].split('&').forEach(function(i){
    q[i.split('=')[0]]=i.split('=')[1];
});

Um URL como this.htm?hello=world&foo=bar criará:

{hello:'world', foo:'bar'}
34
tim

Aqui está uma versão estendida da versão "Andyle's strings query strings". Corrigido um bug (?key=1&key[]=2&key[]=3; 1 foi perdido e substituído por [2,3]), feito algumas pequenas melhorias de performance (re-decodificação de valores, recálculo de "[" posição, etc.) e adicionado um número de melhorias (funcionalizado, suporte para ?key=1&key=2, suporte para delimitadores ;). Deixei as variáveis ​​irritantemente curtas, mas adicionei comentários em abundância para torná-las legíveis (oh, e reutilizei v dentro das funções locais, desculpe se isso é confuso;).

Ele irá lidar com a seguinte querystring ...

? teste = Olá & pessoa = neek & person [] = jeff & person [] = jim e pessoa [extra] = john & test3 & nocache = 1398914891264

... tornando-se um objeto que parece ...

{
    "test": "Hello",
    "person": {
        "0": "neek",
        "1": "jeff",
        "2": "jim",
        "length": 3,
        "extra": "john"
    },
    "test3": "",
    "nocache": "1398914891264"
}

Como você pode ver acima, esta versão lida com alguma medida de matrizes "malformadas", isto é - person=neek&person[]=jeff&person[]=jim ou person=neek&person=jeff&person=jim como a chave é identificável e válida (pelo menos em dotNet's NameValueCollection.Add ):

Se a chave especificada já existir na instância NameValueCollection de destino, o valor especificado será adicionado à lista de valores separada por vírgula existente no formato "value1, value2, value3".

Parece que o júri está um pouco fora em chaves repetidas como não há especificação. Neste caso, várias chaves são armazenadas como uma matriz (falsa). Mas note que eu não processa valores baseado em vírgulas em matrizes.

O código:

getQueryStringKey = function(key) {
    return getQueryStringAsObject()[key];
};


getQueryStringAsObject = function() {
    var b, cv, e, k, ma, sk, v, r = {},
        d = function (v) { return decodeURIComponent(v).replace(/\+/g, " "); }, //# d(ecode) the v(alue)
        q = window.location.search.substring(1), //# suggested: q = decodeURIComponent(window.location.search.substring(1)),
        s = /([^&;=]+)=?([^&;]*)/g //# original regex that does not allow for ; as a delimiter:   /([^&=]+)=?([^&]*)/g
    ;

    //# ma(make array) out of the v(alue)
    ma = function(v) {
        //# If the passed v(alue) hasn't been setup as an object
        if (typeof v != "object") {
            //# Grab the cv(current value) then setup the v(alue) as an object
            cv = v;
            v = {};
            v.length = 0;

            //# If there was a cv(current value), .Push it into the new v(alue)'s array
            //#     NOTE: This may or may not be 100% logical to do... but it's better than loosing the original value
            if (cv) { Array.prototype.Push.call(v, cv); }
        }
        return v;
    };

    //# While we still have key-value e(ntries) from the q(uerystring) via the s(earch regex)...
    while (e = s.exec(q)) { //# while((e = s.exec(q)) !== null) {
        //# Collect the open b(racket) location (if any) then set the d(ecoded) v(alue) from the above split key-value e(ntry) 
        b = e[1].indexOf("[");
        v = d(e[2]);

        //# As long as this is NOT a hash[]-style key-value e(ntry)
        if (b < 0) { //# b == "-1"
            //# d(ecode) the simple k(ey)
            k = d(e[1]);

            //# If the k(ey) already exists
            if (r[k]) {
                //# ma(make array) out of the k(ey) then .Push the v(alue) into the k(ey)'s array in the r(eturn value)
                r[k] = ma(r[k]);
                Array.prototype.Push.call(r[k], v);
            }
            //# Else this is a new k(ey), so just add the k(ey)/v(alue) into the r(eturn value)
            else {
                r[k] = v;
            }
        }
        //# Else we've got ourselves a hash[]-style key-value e(ntry) 
        else {
            //# Collect the d(ecoded) k(ey) and the d(ecoded) sk(sub-key) based on the b(racket) locations
            k = d(e[1].slice(0, b));
            sk = d(e[1].slice(b + 1, e[1].indexOf("]", b)));

            //# ma(make array) out of the k(ey) 
            r[k] = ma(r[k]);

            //# If we have a sk(sub-key), plug the v(alue) into it
            if (sk) { r[k][sk] = v; }
            //# Else .Push the v(alue) into the k(ey)'s array
            else { Array.prototype.Push.call(r[k], v); }
        }
    }

    //# Return the r(eturn value)
    return r;
};
31
Campbeln

Esta é uma função que criei há algum tempo e estou muito feliz com isso. Não é sensível a maiúsculas e minúsculas - o que é útil. Além disso, se o QS solicitado não existir, ele apenas retornará uma string vazia.

Eu uso uma versão compactada disso. Estou postando descompactado para os tipos novatos para explicar melhor o que está acontecendo.

Tenho certeza de que isso poderia ser otimizado ou feito de maneira diferente para funcionar mais rápido, mas sempre funcionou muito bem para o que eu preciso.

Apreciar.

function getQSP(sName, sURL) {
    var theItmToRtn = "";
    var theSrchStrg = location.search;
    if (sURL) theSrchStrg = sURL;
    var sOrig = theSrchStrg;
    theSrchStrg = theSrchStrg.toUpperCase();
    sName = sName.toUpperCase();
    theSrchStrg = theSrchStrg.replace("?", "&") theSrchStrg = theSrchStrg + "&";
    var theSrchToken = "&" + sName + "=";
    if (theSrchStrg.indexOf(theSrchToken) != -1) {
        var theSrchTokenLth = theSrchToken.length;
        var theSrchTokenLocStart = theSrchStrg.indexOf(theSrchToken) + theSrchTokenLth;
        var theLocOfNextAndSign = theSrchStrg.indexOf("&", theSrchTokenLocStart);
        theItmToRtn = unescape(sOrig.substring(theSrchTokenLocStart, theLocOfNextAndSign));
    }
    return unescape(theItmToRtn);
}
31
Clint

Acabamos de lançar o arg.js , um projeto destinado a resolver este problema de uma vez por todas. É tradicionalmente tão difícil, mas agora você pode fazer:

var name = Arg.get("name");

ou recebendo o lote inteiro:

var params = Arg.all();

e se você se importa com a diferença entre ?query=true e #hash=true, então você pode usar os métodos Arg.query() e Arg.hash().

27
Mat Ryer

O problema com a resposta principal nessa questão é que os parâmetros não suportados são colocados após #, mas às vezes é necessário obter esse valor também.

Modifiquei a resposta para permitir que ela analise uma string de consulta completa com um sinal de hash também:

var getQueryStringData = function(name) {
    var result = null;
    var regexS = "[\\?&#]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec('?' + window.location.href.split('?')[1]);
    if (results != null) {
        result = decodeURIComponent(results[1].replace(/\+/g, " "));
    }
    return result;
};
27
Ph0en1x
function GetQueryStringParams(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');

    for (var i = 0; i < sURLVariables.length; i++)
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam)
        {
            return sParameterName[1];
        }
    }
}​

E é assim que você pode usar essa função assumindo que o URL é

http://dummy.com/?stringtext=jquery&stringword=jquerybyexample

var tech = GetQueryStringParams('stringtext');
var blog = GetQueryStringParams('stringword');
25
gewel
http://someurl.com?key=value&keynovalue&keyemptyvalue=&&keynovalue=nowhasvalue#somehash
  • Par de chave/valor regular (?param=value)
  • Chaves sem valor (?param: nenhum sinal ou valor de igualdade)
  • Chaves com valor vazio (?param=: sinal de igual, mas nenhum valor para a direita do sinal de igual)
  • Chaves Repetidas (?param=1&param=2)
  • Remove Chaves Vazias (?&&: sem chave ou valor)

Código:

  • var queryString = window.location.search || '';
    var keyValPairs = [];
    var params      = {};
    queryString     = queryString.substr(1);
    
    if (queryString.length)
    {
       keyValPairs = queryString.split('&');
       for (pairNum in keyValPairs)
       {
          var key = keyValPairs[pairNum].split('=')[0];
          if (!key.length) continue;
          if (typeof params[key] === 'undefined')
             params[key] = [];
          params[key].Push(keyValPairs[pairNum].split('=')[1]);
       }
    }
    

Como ligar:

  • params['key'];  // returns an array of values (1..n)
    

Saída:

  • key            ["value"]
    keyemptyvalue  [""]
    keynovalue     [undefined, "nowhasvalue"]
    
20
vol7ron

Se você estiver usando Browserify, você pode usar o módulo url de Node.js:

var url = require('url');

url.parse('http://example.com/?bob=123', true).query;

// returns { "bob": "123" }

Outras leituras: URL Node.js v0.12.2 Manual e Documentação

EDIT: Você pode usar URL interface, é bastante adotado em quase todo o novo navegador e se o código for executado em um navegador antigo, você pode usar um polyfill como este . Aqui está um exemplo de código sobre como usar a interface de URL para obter parâmetros de consulta (também conhecidos como parâmetros de pesquisa)

const url = new URL('http://example.com/?bob=123');
url.searchParams.get('bob'); 

Você também pode usar URLSearchParams para ele, aqui está um exemplo do MDN para fazer isso com URLSearchParams:

var paramsString = "q=URLUtils.searchParams&topic=api";
var searchParams = new URLSearchParams(paramsString);

//Iterate the search parameters.
for (let p of searchParams) {
  console.log(p);
}

searchParams.has("topic") === true; // true
searchParams.get("topic") === "api"; // true
searchParams.getAll("topic"); // ["api"]
searchParams.get("foo") === null; // true
searchParams.append("topic", "webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=api&topic=webdev"
searchParams.set("topic", "More webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=More+webdev"
searchParams.delete("topic");
searchParams.toString(); // "q=URLUtils.searchParams"
20
nkh

Eu desenvolvi uma pequena biblioteca usando técnicas listadas aqui para criar uma solução fácil de usar e solta para problemas com anyones; Pode ser encontrado aqui:

https://github.com/Nijikokun/query-js

uso

Buscando parâmetro/chave específica:

query.get('param');

Usando o construtor para buscar o objeto inteiro:

var storage = query.build();
console.log(storage.param);

e muito mais ... verifique o link do github para mais exemplos.

recursos

  1. Cache em ambos os decodificação e parâmetros
  2. Suporta cadeias de consulta hash #hello?page=3
  3. Suporta a passagem de consultas personalizadas
  4. Suporta Parâmetros de Matriz/Objeto user[]="jim"&user[]="bob"
  5. Suporta gerenciamento vazio &&
  6. Suporta parâmetros de declaração sem valores name&hello="world"
  7. Suporta parâmetros repetidos param=1&param=2
  8. Fonte limpa, compacta e legível 4kb
  9. Suporte a AMD, Exigir, Nó
20
Nijikokun

One-liner para obter a consulta:

var value = location.search.match(new RegExp(key + "=(.*?)($|\&)", "i"))[1];
20
Anoop

Um método muito leve de jQuery:

var qs = window.location.search.replace('?','').split('&'),
    request = {};
$.each(qs, function(i,v) {
    var initial, pair = v.split('=');
    if(initial = request[pair[0]]){
        if(!$.isArray(initial)) {
            request[pair[0]] = [initial]
        }
        request[pair[0]].Push(pair[1]);
    } else {
        request[pair[0]] = pair[1];
    }
    return;
});
console.log(request);

E para alertar, por exemplo? Q

alert(request.q)
17
Roi

Aqui está minha versão do código de análise de string de consulta no GitHub .

É "prefixado" com jquery. *, Mas a função de análise em si não usa jQuery. É muito rápido, mas ainda aberto para algumas otimizações de desempenho simples.

Também suporta a codificação de listas e tabelas de hash no URL, como:

arr[]=10&arr[]=20&arr[]=100

ou

hash[key1]=hello&hash[key2]=moto&a=How%20are%20you

jQuery.toQueryParams = function(str, separator) {
    separator = separator || '&'
    var obj = {}
    if (str.length == 0)
        return obj
    var c = str.substr(0,1)
    var s = c=='?' || c=='#'  ? str.substr(1) : str; 

    var a = s.split(separator)
    for (var i=0; i<a.length; i++) {
        var p = a[i].indexOf('=')
        if (p < 0) {
            obj[a[i]] = ''
            continue
        }
        var k = decodeURIComponent(a[i].substr(0,p)),
            v = decodeURIComponent(a[i].substr(p+1))

        var bps = k.indexOf('[')
        if (bps < 0) {
            obj[k] = v
            continue;
        } 

        var bpe = k.substr(bps+1).indexOf(']')
        if (bpe < 0) {
            obj[k] = v
            continue;
        }

        var bpv = k.substr(bps+1, bps+bpe-1)
        var k = k.substr(0,bps)
        if (bpv.length <= 0) {
            if (typeof(obj[k]) != 'object') obj[k] = []
            obj[k].Push(v)
        } else {
            if (typeof(obj[k]) != 'object') obj[k] = {}
            obj[k][bpv] = v
        }
    }
    return obj;

}
16
Vadim

Aqui está o que estou usando:

/**
 * Examples:
 * getUrlParams()['myparam']    // url defaults to the current page
 * getUrlParams(url)['myparam'] // url can be just a query string
 *
 * Results of calling `getUrlParams(url)['myparam']` with various urls:
 * example.com                               (undefined)
 * example.com?                              (undefined)
 * example.com?myparam                       (empty string)
 * example.com?myparam=                      (empty string)
 * example.com?myparam=0                     (the string '0')
 * example.com?myparam=0&myparam=override    (the string 'override')
 *
 * Origin: http://stackoverflow.com/a/23946023/2407309
 */
function getUrlParams (url) {
    var urlParams = {} // return value
    var queryString = getQueryString()
    if (queryString) {
        var keyValuePairs = queryString.split('&')
        for (var i = 0; i < keyValuePairs.length; i++) {
            var keyValuePair = keyValuePairs[i].split('=')
            var paramName = keyValuePair[0]
            var paramValue = keyValuePair[1] || ''
            urlParams[paramName] = decodeURIComponent(paramValue.replace(/\+/g, ' '))
        }
    }
    return urlParams // functions below
    function getQueryString () {
        var reducedUrl = url || window.location.search
        reducedUrl = reducedUrl.split('#')[0] // Discard fragment identifier.
        var queryString = reducedUrl.split('?')[1]
        if (!queryString) {
            if (reducedUrl.search('=') !== false) { // URL is a query string.
                queryString = reducedUrl
            }
        }
        return queryString
    } // getQueryString
} // getUrlParams

Retornar 'override' em vez de '0' no último caso torna-o consistente com o PHP. Funciona no IE7.

12
Vladimir Kornea

Eu preferiria usar split() em vez de Regex para esta operação:

function getUrlParams() {
    var result = {};
    var params = (window.location.search.split('?')[1] || '').split('&');
    for(var param in params) {
        if (params.hasOwnProperty(param)) {
            var paramParts = params[param].split('=');
            result[paramParts[0]] = decodeURIComponent(paramParts[1] || "");
        }
    }
    return result;
}
11
Eneko Alonso

Para quem quer um método curto (com limitações):

location.search.split('myParameter=')[1]
10
George

Obtém todos os parâmetros da querystring, incluindo os valores da caixa de seleção (arrays).

Considerando o uso correto e normal dos parâmetros GET, as coisas que vejo estão faltando, na maioria das funções, é o suporte para matrizes e a remoção de dados hash.

Então eu escrevi essa função:

function qs(a){
 if(!a)return {};
 a=a.split('#')[0].split('&');
 var b=a.length,c={},d,k,v;
 while(b--){
  d=a[b].split('=');
  k=d[0].replace('[]',''),v=decodeURIComponent(d[1]||'');
  c[k]?typeof c[k]==='string'?(c[k]=[v,c[k]]):(c[k].unshift(v)):c[k]=v;
 }
 return c
}

Usando operadores de taquigrafia e while-- loop, o desempenho deve ser muito bom para.

Suporte:

  1. Valores vazios (tecla =/chave)
  2. Valor de chave (chave = valor)
  3. Matrizes (chave [] = valor)
  4. Hash (a hashtag é dividida)

Notas:

Não suporta arrays de objetos (key [key] = value)

Se o espaço é +, permanece um +.

Adicione .replace(/\+/g, " ") se você precisar.

Uso:

qs('array[]=1&array[]=2&key=value&empty=&empty2#hash')

Retorno:

{
    "empty": "",
    "key": "value",
    "array": [
        "1",
        "2"
    ]
}

Demo:

http://jsfiddle.net/ZQMrt/1/

Info

Se você não entender alguma coisa ou não conseguir ler a função, é só pedir. Estou feliz em explicar o que fiz aqui.

Se você acha que a função é ilegível e insustentável, fico feliz em reescrever a função para você, mas considere que os operadores abreviados e bitwise são sempre mais rápidos que uma sintaxe padrão (talvez leia sobre atalhos e operadores bitwise no ECMA-262). reservar ou usar seu mecanismo de pesquisa favorito. Reescrever o código em uma sintaxe legível padrão significa perda de desempenho.

10
cocco

Este funciona bem

function getQuerystring(key) {
    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 (pair[0] == key) {
            return pair[1];
        }
    }
}

tirado de aqui

9
IT ppl
function getUrlVar(key){
    var result = new RegExp(key + "=([^&]*)", "i").exec(window.location.search); 
    return result && unescape(result[1]) || ""; 
}

https://Gist.github.com/1771618

8
alkos333

Essa função converte a querystring em um objeto semelhante a JSON, além de manipular parâmetros sem valor e valores múltiplos:

"use strict";
function getQuerystringData(name) {
    var data = { };
    var parameters = window.location.search.substring(1).split("&");
    for (var i = 0, j = parameters.length; i < j; i++) {
        var parameter = parameters[i].split("=");
        var parameterName = decodeURIComponent(parameter[0]);
        var parameterValue = typeof parameter[1] === "undefined" ? parameter[1] : decodeURIComponent(parameter[1]);
        var dataType = typeof data[parameterName];
        if (dataType === "undefined") {
            data[parameterName] = parameterValue;
        } else if (dataType === "array") {
            data[parameterName].Push(parameterValue);
        } else {
            data[parameterName] = [data[parameterName]];
            data[parameterName].Push(parameterValue);
        }
    }
    return typeof name === "string" ? data[name] : data;
}

Realizamos uma verificação para undefined em parameter[1] porque decodeURIComponent retorna a string "undefined" se a variável for undefined, e isso está errado.

Uso:

"use strict";
var data = getQuerystringData();
var parameterValue = getQuerystringData("parameterName");
6
Albireo

Tente isto:

String.prototype.getValueByKey = function(k){
    var p = new RegExp('\\b'+k+'\\b','gi');
    return this.search(p) != -1 ? decodeURIComponent(this.substr(this.search(p)+k.length+1).substr(0,this.substr(this.search(p)+k.length+1).search(/(&|;|$)/))) : "";
};

Então ligue assim:

if(location.search != "") location.search.getValueByKey("id");

Você pode usar isso para cookies também:

if(navigator.cookieEnabled) document.cookie.getValueByKey("username");

Isso só funciona para seqüências de caracteres que têm key=value[&|;|$]... não funcionará em objetos/matrizes.

Se você não quiser usar String.prototype ... mova-o para uma função e passe a string como um argumento

6
user981090

Eu usei este código (JavaScript) para obter o que é passado através do URL:

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

Então, para atribuir o valor a uma variável, você só precisa especificar qual parâmetro deseja obter, ou seja, se o URL é example.com/?I=1&p=2&f=3

Você pode fazer isso para obter os valores:

var getI = getUrlVars()["I"];
var getP = getUrlVars()["p"];
var getF = getUrlVars()["f"];

então os valores seriam:

getI = 1, getP = 2 and getF = 3
6
user2579312

O código a seguir criará um objeto que possui dois métodos:

  1. isKeyExist: verifica se existe um determinado parâmetro
  2. getValue: Obtém o valor de um parâmetro específico.

var QSParam = new function() {
       var qsParm = {};
       var query = window.location.search.substring(1);
       var params = query.split('&');
       for (var i = 0; i < params.length; i++) {
           var pos = params[i].indexOf('=');
           if (pos > 0) {
               var key = params[i].substring(0, pos);
               var val = params[i].substring(pos + 1);
               qsParm[key] = val;
           }
       }
       this.isKeyExist = function(query){
           if(qsParm[query]){
               return true;
           }
           else{
              return false;
           }
       };
       this.getValue = function(query){
           if(qsParm[query])
           {
               return qsParm[query];
           }
           throw "URL does not contain query "+ query;
       }
};
6
Anoop

A função a seguir retorna uma versão do objeto do seu queryString. Você pode simplesmente escrever obj.key1 e obj.key2 para acessar os valores key1 e key2 no parâmetro.

function getQueryStringObject()
{
    var querystring = document.location.search.replace('?','').split( '&' );
    var objQueryString={};
    var key="",val="";
    if(typeof querystring == 'undefined')
    {
        return (typeof querystring);
    }
    for(i=0;i<querystring.length;i++)
    {
        key=querystring[i].split("=")[0];
        val=querystring[i].split("=")[1];
        objQueryString[key] = val;
    }
    return objQueryString;
}

E para usar esta função você pode escrever

var obj= getQueryStringObject();
alert(obj.key1);
5
Imdad

Aqui está minha opinião sobre isso. Esta primeira função decodifica uma string de URL em um objeto de pares nome/valor:

url_args_decode = function (url) {
  var args_enc, el, i, nameval, ret;
  ret = {};
  // use the DOM to parse the URL via an 'a' element
  el = document.createElement("a");
  el.href = url;
  // strip off initial ? on search and split
  args_enc = el.search.substring(1).split('&');
  for (i = 0; i < args_enc.length; i++) {
    // convert + into space, split on =, and then decode 
    args_enc[i].replace(/\+/g, ' ');
    nameval = args_enc[i].split('=', 2);
    ret[decodeURIComponent(nameval[0])]=decodeURIComponent(nameval[1]);
  }
  return ret;
};

E como um bônus adicional, se você alterar alguns dos argumentos, você pode usar essa segunda função para colocar a matriz de args de volta na cadeia de URL:

url_args_replace = function (url, args) {
  var args_enc, el, name;
  // use the DOM to parse the URL via an 'a' element
  el = document.createElement("a");
  el.href = url;
  args_enc = [];
  // encode args to go into url
  for (name in args) {
    if (args.hasOwnProperty(name)) {
      name = encodeURIComponent(name);
      args[name] = encodeURIComponent(args[name]);
      args_enc.Push(name + '=' + args[name]);
    }
  }
  if (args_enc.length > 0) {
    el.search = '?' + args_enc.join('&');
  } else {
    el.search = '';
  }
  return el.href;
};
5
BMitch

Eu fiz uma pequena biblioteca de URLs para as minhas necessidades aqui: https://github.com/Mikhus/jsurl

É uma maneira mais comum de manipular os URLs em JavaScript. Enquanto isso, é realmente leve (minificado e gzipped <1 KB) e tem uma API muito simples e limpa. E não precisa de nenhuma outra biblioteca para funcionar.

Quanto à questão inicial, é muito simples de fazer:

var u = new Url; // Current document URL
// or
var u = new Url('http://user:[email protected]:8080/some/path?foo=bar&bar=baz#anchor');

// Looking for query string parameters
alert( u.query.bar);
alert( u.query.foo);

// Modifying query string parameters
u.query.foo = 'bla';
u.query.woo = ['hi', 'hey']

alert(u.query.foo);
alert(u.query.woo);
alert(u);
5
Mikhus

Se você quiser parâmetros no estilo array URL.js suporta parâmetros estilo array arbitrariamente aninhados, bem como índices de string (mapas). Também lida com a decodificação de URL.

url.get("val[0]=zero&val[1]=one&val[2]&val[3]=&val[4]=four&val[5][0]=n1&val[5][1]=n2&val[5][2]=n3&key=val", {array:true});
// Result
{
    val: [
        'zero',
        'one',
        true,
        '',
        'four',
        [ 'n1', 'n2', 'n3' ]
    ]
    key: 'val'
}
4
Kevin Cox

Existem muitas soluções para recuperar valores de consulta URI, eu prefiro este porque é curto e funciona muito bem:

function get(name){
   if(name=(new RegExp('[?&]'+encodeURIComponent(name)+'=([^&]*)')).exec(location.search))
      return decodeURIComponent(name[1]);
}
4
BlueMark

Uma solução simples com JavaScript simples e expressões regulares :

alert(getQueryString("p2"));

function getQueryString (Param) {
    return decodeURI("http://www.example.com/?p1=p11&p2=p2222".replace(new RegExp("^(?:.*[&?]" + encodeURI(Param).replace(/[.+*]/g, "$&") + "(?:=([^&]*))?)?.*$", "i"), "$1"));
}

JsFiddle

4
Saidulu Buchhala

Existe uma utilidade url de Nice para isso com um pouco de sugar cool:

http://www.example.com/path/index.html?silly=willy#chucky=cheese

url();            // http://www.example.com/path/index.html?silly=willy#chucky=cheese
url('domain');    // example.com
url('1');         // path
url('-1');        // index.html
url('?');         // silly=willy
url('?silly');    // willy
url('?poo');      // (an empty string)
url('#');         // chucky=cheese
url('#chucky');   // cheese
url('#poo');      // (an empty string)

Confira mais exemplos e faça o download aqui: https://github.com/websanova/js-url#url

4
Rob

Esta é a função mais simples e pequena do JavaScript para obter um valor de parâmetro de string int e de URL

/* THIS FUNCTION IS TO FETCH INT PARAMETER VALUES */

function getParameterint(param) {
            var val = document.URL;
            var url = val.substr(val.indexOf(param))  
            var n=parseInt(url.replace(param+"=",""));
            alert(n); 
}
getParameteraint("page");
getParameteraint("pagee");

/*THIS FUNCTION IS TO FETCH STRING PARAMETER*/
function getParameterstr(param) {
            var val = document.URL;
            var url = val.substr(val.indexOf(param))  
            var n=url.replace(param+"=","");
            alert(n); 
}
getParameterstr("str");

Fonte E DEMO: http://bloggerplugnplay.blogspot.in/2012/08/how-to-get-url-parameter-in-javascript.html

4
Code Spy

Há uma implementação robusta na fonte do Node.js
https://github.com/joyent/node/blob/master/lib/querystring.js

Também qs TJ's anams params anseiam
https://github.com/visionmedia/node-querystring

4
clyfe

Se você tiver Underscore.js ou lodash , uma maneira rápida e suja de fazer isso é:

_.object(window.location.search.slice(1).split('&').map(function (val) { return val.split('='); }));
4
acjay
var getUrlParameters = function (name, url) {
    if (!name) {
        return undefined;
    }

    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
    url = url || location.search;

    var regex = new RegExp('[\\?&#]' + name + '=?([^&#]*)', 'gi'), result, resultList = [];

    while (result = regex.exec(url)) {
        resultList.Push(decodeURIComponent(result[1].replace(/\+/g, ' ')));
    }

    return resultList.length ? resultList.length === 1 ? resultList[0] : resultList : undefined;
};
4
kayz1

Tomei esta resposta e adicionei suporte para passar a URL opcionalmente como um parâmetro; cai de volta para window.location.search. Obviamente, isso é útil para obter os parâmetros de string de consulta de URLs que não são a página atual:

(function($, undef) {
  $.QueryString = function(url) {
    var pairs, qs = null, index, map = {};
    if(url == undef){
      qs = window.location.search.substr(1);
    }else{
      index = url.indexOf('?');
      if(index == -1) return {};
      qs = url.substring(index+1);
    }
    pairs = qs.split('&');
    if (pairs == "") return {};
    for (var i = 0; i < pairs.length; ++i)
    {
      var p = pairs[i].split('=');
      if(p.length != 2) continue;
      map[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
    }
    return map;
  };
})(jQuery);
4
mynameistechno

Acredito que esta seja uma maneira precisa e concisa de conseguir isso (modificada de http://css-tricks.com/snippets/javascript/get-url-variables/ ):

function getQueryVariable(variable) {

    var query = window.location.search.substring(1),            // Remove the ? from the query string.
        vars = query.split("&");                                // Split all values by ampersand.

    for (var i = 0; i < vars.length; i++) {                     // Loop through them...
        var pair = vars[i].split("=");                          // Split the name from the value.
        if (pair[0] == variable) {                              // Once the requested value is found...
            return ( pair[1] == undefined ) ? null : pair[1];   // Return null if there is no value (no equals sign), otherwise return the value.
        }
    }

    return undefined;                                           // Wasn't found.

}
4
Gabriel Ryan Nahmias

Este é um método muito simples para obter o valor do parâmetro (string de consulta)

Use a função gV(para_name) para recuperar seu valor

var a=window.location.search;
a=a.replace(a.charAt(0),""); //Removes '?'
a=a.split("&");

function gV(x){
 for(i=0;i<a.length;i++){
  var b=a[i].substr(0,a[i].indexOf("="));
  if(x==b){
   return a[i].substr(a[i].indexOf("=")+1,a[i].length)}
3
Ankit_Shah55

Se você não quiser usar uma biblioteca JavaScript, poderá usar as funções de string JavaScript para analisar window.location. Mantenha este código em um arquivo .js externo e você poderá usá-lo repetidamente em diferentes projetos.

// Example - window.location = "index.htm?name=bob";

var value = getParameterValue("name");

alert("name = " + value);

function getParameterValue(param)
{
    var url = window.location;
    var parts = url.split('?');
    var params = parts[1].split('&');
    var val = "";

    for ( var i=0; i<params.length; i++)
    {
        var paramNameVal = params[i].split('=');

        if ( paramNameVal[0] == param )
        {
            val = paramNameVal[1];
        }
    }
    return val;
}
3
Robert Bolton

Mais bonito mas básico:

data = {};
$.each(
    location.search.substr(1).split('&').filter(Boolean).map(function(kvpairs){
        return kvpairs.split('=')
    }),
    function(i,values) {
        data[values.shift()] = values.join('=')
    }
);

Não lida com listas de valores como ?a[]=1&a[]2

3
Damien

Eu recomendo Dar Lessons como um bom plugin. Eu trabalhei com isso há muito tempo. Você também pode usar o código a seguir. Jus colocou var queryObj = {}; antes de document.ready e colocou o código abaixo no começo de document.ready. Após este código, você pode usar queryObj["queryObjectName"] para qualquer objeto de consulta que tenha

var querystring = location.search.replace('?', '').split('&');
for (var i = 0; i < querystring.length; i++) {
    var name = querystring[i].split('=')[0];
    var value = querystring[i].split('=')[1];
    queryObj[name] = value;
}
2
farnoush resa

A expressão mais curta possível em termos de tamanho para obter um objeto de consulta parece ser:

var params = {};
location.search.substr(1).replace(/([^&=]*)=([^&]*)&?/g,
  function () { params[decodeURIComponent(arguments[1])] = decodeURIComponent(arguments[2]); });

Você pode fazer uso do elemento A para analisar um URI de uma string em seus componentes location- like (para se livrar de #..., por exemplo):

var a = document.createElement('a');
a.href = url;
// Parse a.search.substr(1)... as above
2
daluege

Usar:

  $(document).ready(function () {
      var urlParams = {};
      (function () {
          var match,
          pl = /\+/g, // Regex for replacing addition symbol with a space
              search = /([^&=]+)=?([^&]*)/g,
              decode = function (s) {
                  return decodeURIComponent(s.replace(pl, " "));
              },
              query = window.location.search.substring(1);

          while (match = search.exec(query))
              urlParams[decode(match[1])] = decode(match[2]);
      })();
      if (urlParams["q1"] === 1) {
          return 1;
      }

Por favor, verifique e deixe-me saber seus comentários. Consulte tambémComo obter o valor de querystring usando jQuery.

2
Pushkraj

Isso irá analisar as variáveis ​​Earrays de uma string de URL. Não usa regex ou qualquer biblioteca externa.

function url2json(url) {
   var obj={};
   function arr_vals(arr){
      if (arr.indexOf(',') > 1){
         var vals = arr.slice(1, -1).split(',');
         var arr = [];
         for (var i = 0; i < vals.length; i++)
            arr[i]=vals[i];
         return arr;
      }
      else
         return arr.slice(1, -1);
   }
   function eval_var(avar){
      if (!avar[1])
          obj[avar[0]] = '';
      else
      if (avar[1].indexOf('[') == 0)
         obj[avar[0]] = arr_vals(avar[1]);
      else
         obj[avar[0]] = avar[1];
   }
   if (url.indexOf('?') > -1){
      var params = url.split('?')[1];
      if(params.indexOf('&') > 2){
         var vars = params.split('&');
         for (var i in vars)
            eval_var(vars[i].split('='));
      }
      else
         eval_var(params.split('='));
   }
   return obj;
}

Exemplo:

var url = "http://www.x.com?luckyNums=[31,21,6]&name=John&favFoods=[pizza]&noVal"
console.log(url2json(url));

Saída:

[object]
   noVal: ""
   favFoods: "pizza"
   name:     "John"
   luckyNums:
      0: "31"
      1: "21"
      2: "6"
2
Pithikos

Essa função retornará um objeto JavaScript analisado com quaisquer valores arbitrariamente aninhados usando a recursão conforme necessário.

Aqui está um jsfiddle example.

[
  '?a=a',
  '&b=a',
  '&b=b',
  '&c[]=a',
  '&c[]=b',
  '&d[a]=a',
  '&d[a]=x',
  '&e[a][]=a',
  '&e[a][]=b',
  '&f[a][b]=a',
  '&f[a][b]=x',
  '&g[a][b][]=a',
  '&g[a][b][]=b',
  '&h=%2B+%25',
  '&i[aa=b',
  '&i[]=b',
  '&j=',
  '&k',
  '&=l',
  '&abc=foo',
  '&def=%5Basf%5D',
  '&ghi=[j%3Dkl]',
  '&xy%3Dz=5',
  '&foo=b%3Dar',
  '&xy%5Bz=5'
].join('');

Dado qualquer um dos exemplos de teste acima.

var qs = function(a) {
  var b, c, e;
  b = {};
  c = function(d) {
    return d && decodeURIComponent(d.replace(/\+/g, " "));
  };
  e = function(f, g, h) {
    var i, j, k, l;
    h = h ? h : null;
    i = /(.+?)\[(.+?)?\](.+)?/g.exec(g);
    if (i) {
      [j, k, l] = [i[1], i[2], i[3]]
      if (k === void 0) {
        if (f[j] === void 0) {
          f[j] = [];
        }
        f[j].Push(h);
      } else {
        if (typeof f[j] !== "object") {
          f[j] = {};
        }
        if (l) {
          e(f[j], k + l, h);
        } else {
          e(f[j], k, h);
        }
      }
    } else {
      if (f.hasOwnProperty(g)) {
        if (Array.isArray(f[g])) {
          f[g].Push(h);
        } else {
          f[g] = [].concat.apply([f[g]], [h]);
        }
      } else {
        f[g] = h;
      }
      return f[g];
    }
  };
  a.replace(/^(\?|#)/, "").replace(/([^#&=?]+)?=?([^&=]+)?/g, function(m, n, o) {
    n && e(b, c(n), c(o));
  });
  return b;
};
1
Peter T Bosse II

Isso vai funcionar ... Você precisa chamar essa função onde você precisa pegar o parametro passando seu nome ...

function getParameterByName(name)
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  alert(results[1]);
  if (results == null)
    return "";
  else
    return results[1];
}
1
sonorita

Rápido, fácil e rápido:

A função:

function getUrlVar() {
    var result = {};
    var location = window.location.href.split('#');
    var parts = location[0].replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        result [key] = value;
    });
    return result;
}

Uso:

var varRequest = getUrlVar()["theUrlVarName"];
1
Shlomi Hassid

Aqui está a implementação do protótipo String:

String.prototype.getParam = function( str ){
    str = str.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regex = new RegExp( "[\\?&]*"+str+"=([^&#]*)" );    
    var results = regex.exec( this );
    if( results == null ){
        return "";
    } else {
        return results[1];
    }
}

Exemplo de chamada:

var status = str.getParam("status")

str pode ser uma string de consulta ou um URL

1
krisrak

Veja isto postar ou usar isto:

<script type="text/javascript" language="javascript">
    $(document).ready(function()
    {
        var urlParams = {};
        (function ()
        {
            var match,
            pl= /\+/g,  // Regular expression for replacing addition symbol with a space
            search = /([^&=]+)=?([^&]*)/g,
            decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
            query  = window.location.search.substring(1);

            while (match = search.exec(query))
                urlParams[decode(match[1])] = decode(match[2]);
        })();

        if (urlParams["q1"] === 1)
        {
            return 1;
        }
    });
</script>
1
soheil bijavar

Fazer isso de maneira confiável está mais envolvido do que se pode pensar no início.

  1. location.search, que é usado em outras respostas, é frágil e deve ser evitado - por exemplo, ele retorna vazio se alguém estragar e colocar um identificador #fragment antes da string ?query.
  2. Há várias formas de escape automático de URLs no navegador, o que torna a decodeURIComponent praticamente obrigatória, na minha opinião.
  3. Muitas strings de consulta são geradas a partir da entrada do usuário, o que significa que as suposições sobre o conteúdo da URL são muito ruins. Incluindo coisas muito básicas como essa, cada chave é única ou até tem um valor.

Para resolver isso, aqui está uma API configurável com uma dose saudável de programação defensiva . Note que pode ser feito metade do tamanho se você estiver disposto a codificar algumas das variáveis, ou se a entrada nunca puder incluir hasOwnProperty, etc.

Versão 1: Retorna um objeto de dados com nomes e valores para cada parâmetro. Ele efetivamente os duplica e sempre respeita o primeiro encontrado da esquerda para a direita.

function getQueryData(url, paramKey, pairKey, missingValue, decode) {

    var query, queryStart, fragStart, pairKeyStart, i, len, name, value, result;

    if (!url || typeof url !== 'string') {
        url = location.href; // more robust than location.search, which is flaky
    }
    if (!paramKey || typeof paramKey !== 'string') {
        paramKey = '&';
    }
    if (!pairKey || typeof pairKey !== 'string') {
        pairKey = '=';
    }
    // when you do not explicitly tell the API...
    if (arguments.length < 5) {
        // it will unescape parameter keys and values by default...
        decode = true;
    }

    queryStart = url.indexOf('?');
    if (queryStart >= 0) {
        // grab everything after the very first ? question mark...
        query = url.substring(queryStart + 1);
    } else {
        // assume the input is already parameter data...
        query = url;
    }
    // remove fragment identifiers...
    fragStart = query.indexOf('#');
    if (fragStart >= 0) {
        // remove everything after the first # hash mark...
        query = query.substring(0, fragStart);
    }
    // make sure at this point we have enough material to do something useful...
    if (query.indexOf(paramKey) >= 0 || query.indexOf(pairKey) >= 0) {
        // we no longer need the whole query, so get the parameters...
        query = query.split(paramKey);
        result = {};
        // loop through the parameters...
        for (i = 0, len = query.length; i < len; i = i + 1) {
            pairKeyStart = query[i].indexOf(pairKey);
            if (pairKeyStart >= 0) {
                name = query[i].substring(0, pairKeyStart);
            } else {
                name = query[i];
            }
            // only continue for non-empty names that we have not seen before...
            if (name && !Object.prototype.hasOwnProperty.call(result, name)) {
                if (decode) {
                    // unescape characters with special meaning like ? and #
                    name = decodeURIComponent(name);
                }
                if (pairKeyStart >= 0) {
                    value = query[i].substring(pairKeyStart + 1);
                    if (value) {
                        if (decode) {
                            value = decodeURIComponent(value);
                        }
                    } else {
                        value = missingValue;
                    }
                } else {
                    value = missingValue;
                }
                result[name] = value;
            }
        }
        return result;
    }
}

Versão 2: Retorna um objeto de mapa de dados com duas matrizes de comprimento idênticas, uma para nomes e outra para valores, com um índice para cada parâmetro. Este suporta nomes duplicados e intencionalmente não os desduplica, porque é provavelmente por isso que você gostaria de usar este formato.

function getQueryData(url, paramKey, pairKey, missingValue, decode) {

   var query, queryStart, fragStart, pairKeyStart, i, len, name, value, result;

   if (!url || typeof url !== 'string') {
       url = location.href; // more robust than location.search, which is flaky
   }
   if (!paramKey || typeof paramKey !== 'string') {
       paramKey = '&';
   }
   if (!pairKey || typeof pairKey !== 'string') {
       pairKey = '=';
   }
   // when you do not explicitly tell the API...
   if (arguments.length < 5) {
       // it will unescape parameter keys and values by default...
       decode = true;
   }

   queryStart = url.indexOf('?');
   if (queryStart >= 0) {
       // grab everything after the very first ? question mark...
       query = url.substring(queryStart + 1);
   } else {
       // assume the input is already parameter data...
       query = url;
   }
   // remove fragment identifiers...
   fragStart = query.indexOf('#');
   if (fragStart >= 0) {
       // remove everything after the first # hash mark...
       query = query.substring(0, fragStart);
   }
   // make sure at this point we have enough material to do something useful...
   if (query.indexOf(paramKey) >= 0 || query.indexOf(pairKey) >= 0) {
       // we no longer need the whole query, so get the parameters...
       query = query.split(paramKey);
       result = {
           names: [],
           values: []
       };
       // loop through the parameters...
       for (i = 0, len = query.length; i < len; i = i + 1) {
           pairKeyStart = query[i].indexOf(pairKey);
           if (pairKeyStart >= 0) {
               name = query[i].substring(0, pairKeyStart);
           } else {
               name = query[i];
           }
           // only continue for non-empty names...
           if (name) {
               if (decode) {
                   // unescape characters with special meaning like ? and #
                   name = decodeURIComponent(name);
               }
               if (pairKeyStart >= 0) {
                   value = query[i].substring(pairKeyStart + 1);
                   if (value) {
                       if (decode) {
                           value = decodeURIComponent(value);
                       }
                   } else {
                       value = missingValue;
                   }
               } else {
                   value = missingValue;
               }
               result.names.Push(name);
               result.values.Push(value);
           }
       }
       return result;
   }

}

1
Seth Holladay

Isso não funcionou para mim, eu quero corresponder ?b como o parâmetro b está presente, e não corresponde ?return como o parâmetro r, aqui está my solution .

window.query_param = function(name) {
  var param_value, params;

  params = location.search.replace(/^\?/, '');
  params = _.map(params.split('&'), function(s) {
    return s.split('=');
  });

  param_value = _.select(params, function(s) {
    return s.first === name;
  })[0];

  if (param_value) {
    return decodeURIComponent(param_value[1] || '');
  } else {
    return null;
  }
};
1
Dorian
// Parse query string
var params = {}, queryString = location.hash.substring(1),
    regex = /([^&=]+)=([^&]*)/g,
    m;
while (m = regex.exec(queryString)) {
    params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
0
Konstantin Tarkus