it-swarm.dev

Come posso ottenere valori stringa di query in JavaScript?

C'è un modo senza plugin per recuperare query string valori tramite jQuery (o senza)?

Se é cosi, come? Se no, c'è un plugin che può farlo?

2701
Kemal Emin

Aggiornamento: settembre 2018

Puoi utilizzare URLSearchParams che è semplice e ha un buon supporto per il browser .

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

Originale

Non hai bisogno di jQuery per questo scopo. Puoi usare solo un puro JavaScript:

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 un parametro è presente più volte (?foo=lorem&foo=ipsum), si otterrà il primo valore (lorem). Non esiste uno standard su questo e gli usi variano, vedi ad esempio questa domanda: Posizione autorevole delle chiavi di query HTTP GET duplicate .
NOTA: la funzione fa distinzione tra maiuscole e minuscole. Se si preferisce il nome del parametro senza distinzione tra maiuscole e minuscole, aggiungere il modificatore 'i' a RegExp


Questo è un aggiornamento basato sulle nuove specifiche di URLSearchParams per ottenere lo stesso risultato in modo più sintetico. Vedere la risposta intitolata " URLSearchParams " di seguito.

7640
Artem Barger

Alcune delle soluzioni pubblicate qui sono inefficienti. La ripetizione della ricerca di espressioni regolari ogni volta che lo script deve accedere a un parametro è completamente inutile, una sola funzione per dividere i parametri in un oggetto di stile array associativo è sufficiente. Se non stai lavorando con l'HTML 5 History API, questo è necessario solo una volta per caricamento della pagina. Anche qui gli altri suggerimenti non riescono a decodificare correttamente l'URL.

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]);
})();

Esempio querystring:

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

Risultato:

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

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

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

Questo potrebbe essere facilmente migliorato per gestire anche le stringhe di query in stile array. Un esempio di questo è qui , ma poiché i parametri di stile array non sono definiti in RFC 3986 I non inquinerà questa risposta con il codice sorgente. Per chi è interessato a una versione "inquinata", guarda la risposta di campbeln qui sotto .

Inoltre, come sottolineato nei commenti, ; è un delimitatore legale per coppie key=value. Richiederebbe una regex più complicata per gestire ; o &, che a mio avviso non è necessario perché è raro che venga usato ; e direi ancor più improbabile che entrambi vengano usati. Se devi supportare ; anziché &, basta scambiarli nella regex.


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

Molto più semplice!

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;
                }, {}
            )
        : {}
};

Senza 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('&'));

Con un URL come ?topic=123&name=query+string, verrà restituito quanto segue:

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

Metodo di Google

Strappando il codice di Google ho trovato il metodo che usano: 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
}

È offuscato, ma è comprensibile. Non funziona perché alcune variabili non sono definite.

Iniziano a cercare i parametri sull'URL da ? e anche dall'hash #. Quindi per ogni parametro si suddividono nel segno di uguale b[f][p]("=") (che assomiglia a indexOf, usano la posizione del char per ottenere la chiave/il valore). Avendolo diviso, controllano se il parametro ha un valore o meno, se ha quindi memorizzato il valore di d, altrimenti continuano semplicemente.

Alla fine viene restituito l'oggetto d, che gestisce l'escaping e il segno +. Questo oggetto è uguale al mio, ha lo stesso comportamento.


Il mio metodo come 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));

Test delle prestazioni (metodo split rispetto al metodo regex) ( jsPerf )

Codice di preparazione: dichiarazione dei metodi

Split test code

var qs = window.GetQueryString(query);

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

Codice di prova Regex

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

Test su Firefox 4.0 x86 su Windows Server 2008 R2/7 x64

  • Metodo split : 144,780 ± 2,17% più veloce
  • Metodo Regex : 13,891 ± 0,85% | 90% più lento
1244
BrunoLM

Versione migliorata di Risposta di Artem Barger :

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

Per ulteriori informazioni sul miglioramento, consultare: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/

650
James

URLSearchParams

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

Esiste un suggerimento di googleURLSearchParams polyfillper le versioni stabili di IE.

Non è standardizzato da W3C , ma è uno standard di vita per WhatWG .

Puoi usarlo sul posto, ma devi rimuovere il punto interrogativo ? (ad esempio, con .slice(1)):

let params = new URLSearchParams(location.search);

o

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

O ovviamente su qualsiasi URL:

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

Puoi ottenere parametri usando anche una proprietà .searchParams abbreviata sull'oggetto URL, in questo modo:

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

Si leggono/impostano i parametri attraverso l'get(KEY), set(KEY, VALUE), append(KEY, VALUE) API. Puoi anche eseguire l'iterazione su tutti i valori for (let p of params) {}.

A implementazione di riferimento e una pagina di esempio sono disponibili per il controllo e il test.

541
Paul Sweatte

Solo un'altra raccomandazione. Il pluginPurlconsente di recuperare tutte le parti dell'URL, inclusi anchor, Host, ecc.

Può essere utilizzato con o senza jQuery.

L'utilizzo è molto semplice e interessante:

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'

Tuttavia, a partire dall'11 novembre 2014, Purl non viene più mantenuto e l'autore consiglia di utilizzare URI.js . Il plugin jQuery è diverso in quanto si concentra sugli elementi - per l'utilizzo con le stringhe, basta usare URI direttamente, con o senza jQuery. Il codice simile apparirebbe come tale, fuller docs here :

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

Una soluzione rapida, completa , che gestisce chiavi multivalore e caratteri codificati .

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
})

Cos'è tutto questo codice ...
"null-coalescing" , valutazione di cortocircuito
ES6 Disegni di distruzione , Funzioni freccia , Stringhe di modelli

"?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"



Ulteriori informazioni ... sulla soluzione JavaScript di Vanilla.

Per accedere a parti diverse di un URL utilizzare location.(search|hash)

La soluzione più semplice (fittizia)

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
  • Maniglie chiavi vuote correttamente.
  • Sostituzioni multi-tasti con scorso valore trovato.
"?a=1&b=0&c=3&d&e&a=5"
> queryDict
a: "5"
b: "0"
c: "3"
d: undefined
e: undefined

Chiavi multivalore

Controllo semplice della chiave (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]]})
  • Ora ritorna array anziché.
  • Accedi ai valori con qd.key[index] o qd[key][index]
> qd
a: ["1", "5"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined]

Caratteri codificati?

Usa decodeURIComponent() per il secondo o entrambi divide.

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"]



Dai commenti

* !!! Si noti che decodeURIComponent(undefined) restituisce stringa "undefined". La soluzione sta in un semplice uso di && , che assicura che decodeURIComponent() non venga richiamato su valori non definiti. (Vedi la "soluzione completa" in alto.)

v = v && decodeURIComponent(v);


Se la querystring è vuota (location.search == ""), il risultato è in qualche modo fuorviante qd == {"": undefined}. Si suggerisce di controllare la querystring prima di lanciare la funzione parsing mi piace:

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

Roshambo su snipplr.com ha uno script semplice per ottenere ciò descritto inOttieni parametri URL con jQuery | Migliorato. Con la sua sceneggiatura puoi anche facilmente estrarre solo i parametri che desideri.

Ecco il 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;
}

Quindi recupera i parametri dalla stringa di query.

Quindi, se la stringa URL/query era xyz.com/index.html?lang=de.

Basta chiamare var langval = $.urlParam('lang');, e ce l'hai.

UZBEKJON ha anche un ottimo post sul blog,Ottieni parametri e valori URL con jQuery.

216
brandonjp

Se stai usando jQuery, puoi usare una libreria, come jQuery BBQ: Back Button & Query Library .

... jQuery BBQ fornisce un metodo .deparam() completo, insieme alla gestione dello stato hash e ai metodi di analisi delle stringhe di frammentazione/query parsing e merge.

Modifica: aggiunta di esempio Deparam:

 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 vuoi semplicemente usare JavaScript semplice, puoi usare ...

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;
    }

})();​

A causa della nuova API della cronologia HTML e in particolare history.pushState() e history.replaceState(), l'URL può cambiare e invalidere la cache dei parametri e dei relativi valori.

Questa versione aggiornerà la cache interna dei parametri ogni volta che cambia la cronologia.

165
alex

Basta usare due divide :

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

Stavo leggendo tutte le risposte precedenti e più complete. Ma penso che sia il metodo più semplice e veloce. Puoi controllare questo jsPerf benchmark

Per risolvere il problema nel commento di Rup, aggiungi una divisione condizionale modificando la prima riga con i due seguenti. Ma la precisione assoluta significa che ora è più lento di regexp (vedi 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;
}

Quindi se sai che non incontrerai la contro-cassa di Rup, questo vince. Altrimenti, regexp.

Or se hai il controllo della querystring e puoi garantire che un valore che stai cercando di ottenere non contenga mai caratteri codificati URL (avere questi in un valore sarebbe una cattiva idea) - puoi usare il seguente versione leggermente più semplificata e leggibile della prima opzione:

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

Ecco il mio tentativo di rendere l'eccellente soluzione di Andy E in un completo plugin jQuery:

;(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);

La sintassi è:

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

Il meglio di entrambi i mondi!

94
Ryan Phelan

Se stai facendo più manipolazioni di URL che semplicemente analizzando la querystring, potresti trovare URI.js utile. È una libreria per manipolare gli URL e viene fornito con tutti i campanelli e i fischietti. (Ci scusiamo per l'auto-pubblicità qui)

per convertire la tua querystring in una mappa:

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

(URI.js inoltre "ripara" le querystrings non valide come ?&foo&&bar=baz& a ?foo&bar=baz)

76
rodneyrehm

Mi piace La soluzione di Ryan Phelan . Ma non vedo alcun motivo di estendere jQuery per questo? Non c'è uso della funzionalità jQuery.

D'altra parte, mi piace la funzione integrata in Google Chrome: window.location.getParameter.

Quindi perché non usare questo? Ok, altri browser non ce l'hanno. Quindi creiamo questa funzione se non esiste:

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];
  };
}

Questa funzione è più o meno di Ryan Phelan, ma è avvolta in modo diverso: nome chiaro e nessuna dipendenza da altre librerie javascript. Ulteriori informazioni su questa funzione sul mio blog .

59
Anatoly Mironov

Ecco un modo veloce per ottenere un oggetto simile al 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();

Per la stringa di query x=5&y&z=hello&x=6 questo restituisce l'oggetto:

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

Mantieni tutto in un semplice codice JavaScript:

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];
}

Chiamalo da qualsiasi posizione nel codice JavaScript:

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

Queste sono tutte ottime risposte, ma avevo bisogno di qualcosa di un po 'più robusto, e ho pensato che tutti potreste voler avere ciò che ho creato.

È un semplice metodo di libreria che esegue la dissezione e la manipolazione dei parametri URL. Il metodo statico ha i seguenti metodi secondari che possono essere richiamati nell'URL dell'oggetto:

  • getHost
  • getPath
  • gethash
  • setHash
  • getparams
  • getQuery
  • setParam
  • getParam
  • hasParam
  • removeParam

Esempio:

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

Da MDN :

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

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

Io uso molto le espressioni regolari, ma non per questo.

Mi sembra più semplice e più efficiente leggere la stringa di query una volta nella mia applicazione e creare un oggetto da tutte le coppie chiave/valore come:

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;
}();

Per un URL come http://domain.com?param1=val1&param2=val2 puoi ottenere il loro valore più tardi nel tuo codice come search.param1 e search.param2.

39
Mic

Codice 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]);
}

Visualizzalo!

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

Sul mio Mac: visualizza test.htm?i=can&has=cheezburger

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

Il metodo jQuery di Roshambo non si occupava dell'URL di decodifica

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

Ho appena aggiunto questa funzionalità anche aggiungendo la dichiarazione di ritorno

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

Ora puoi trovare il Gist aggiornato:

$.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

Mi piace questo (tratto da jquery-howto.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;
}

Funziona alla grande per me.

36
Tomamais

Ecco la mia modifica di questa eccellente risposta - con una maggiore capacità di analizzare stringhe di query con chiavi senza valori.

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! Il parametro per quella funzione nell'ultima riga è diverso. È solo un esempio di come si può passare un URL arbitrario ad esso. Puoi utilizzare l'ultima riga della risposta di Bruno per analizzare l'URL corrente.

Quindi cosa è esattamente cambiato? Con url http://sb.com/reg/step1?param= i risultati saranno uguali. Ma con url http://sb.com/reg/step1?param la soluzione di Bruno restituisce un oggetto senza chiavi, mentre il mio restituisce un oggetto con il valore param e il valore undefined della chiave.

36
skaurus

Avevo bisogno di un oggetto dalla stringa di query e odio molto codice. Potrebbe non essere il più robusto dell'universo, ma sono solo poche righe di codice.

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

Un URL come this.htm?hello=world&foo=bar creerà:

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

Ecco una versione estesa della versione "Gestisci serie di stringhe di query stile array" di Andy E. Risolto un bug (?key=1&key[]=2&key[]=3; 1 è stato perso e sostituito con [2,3]), apportato alcuni miglioramenti minori delle prestazioni (ri-decodifica dei valori, ricalcolo di "[" posizione, ecc.) E aggiunto una serie di miglioramenti (funzionalizzati, supporto per ?key=1&key=2, supporto per i delimitatori ;). Ho lasciato le variabili fastidiosamente brevi, ma ho aggiunto commenti a bizzeffe per renderle leggibili (oh, e ho riutilizzato v all'interno delle funzioni locali, scusa se questo è confuso;).

Gestirà il seguente querystring ...

? Test = Ciao & persona = neek & persona [] = Jeff & persona [] = Jim & persona [extra] = John & test3 & nocache = 1.398.914,891264 millions

... trasformandolo in un oggetto che sembra ...

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

Come puoi vedere sopra, questa versione gestisce alcune misure di matrici "malformate", ad esempio - person=neek&person[]=jeff&person[]=jim o person=neek&person=jeff&person=jim in quanto la chiave è identificabile e valida (almeno in dotNet's NameValueCollection.Add ):

Se la chiave specificata esiste già nell'istanza NameValueCollection di destinazione, il valore specificato viene aggiunto all'elenco di valori separati da virgole nella forma "valore1, valore2, valore3".

Sembra la giuria è in qualche modo fuori su tasti ripetuti in quanto non ci sono specifiche. In questo caso, più chiavi vengono memorizzate come una matrice (falsa). Ma si noti che I do not processa valori basati su virgole in array.

Il codice:

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

Questa è una funzione che ho creato qualche tempo fa e sono abbastanza felice. Non è sensibile al maiuscolo/minuscolo - che è a portata di mano. Inoltre, se il QS richiesto non esiste, restituisce semplicemente una stringa vuota.

Io uso una versione compressa di questo. Sto postando non compresso per i tipi di novizio per spiegare meglio cosa sta succedendo.

Sono sicuro che questo potrebbe essere ottimizzato o fatto in modo diverso per funzionare più velocemente, ma ha sempre funzionato bene per quello che mi serve.

Godere.

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

Abbiamo appena rilasciato arg.js , un progetto finalizzato a risolvere questo problema una volta per tutte. Tradizionalmente è stato così difficile ma ora puoi fare:

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

o ottenendo l'intero lotto:

var params = Arg.all();

e se ti interessa la differenza tra ?query=true e #hash=true allora puoi usare i metodi Arg.query() e Arg.hash().

27
Mat Ryer

Il problema con la risposta più importante a questa domanda è che i parametri non supportati vengono posizionati dopo #, ma a volte è necessario ottenere anche questo valore.

Ho modificato la risposta per consentire di analizzare una stringa di query completa con un segno di hash anche:

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 questo è come puoi usare questa funzione presumendo che l'URL sia

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
  • Coppia chiave/valore normale (?param=value)
  • Chiavi senza valore (?param: nessun segno uguale o valore)
  • Chiavi con valore vuoto (?param=: segno uguale, ma nessun valore a destra del segno di uguale)
  • Tasti ripetuti (?param=1&param=2)
  • Rimuove le chiavi vuote (?&&: nessuna chiave o valore)

Codice:

  • 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]);
       }
    }
    

Come chiamare:

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

Produzione:

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

Se utilizzi Browserify, puoi utilizzare il modulo url da Node.js:

var url = require('url');

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

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

Ulteriori letture: URL Node.js v0.12.2 Manuale e documentazione

EDIT: È possibile utilizzare l'interfaccia URL , è abbastanza diffuso in quasi tutti i nuovi browser e se il codice verrà eseguito su un vecchio browser è possibile utilizzare un polyfill come questo . Ecco un esempio di codice su come utilizzare l'interfaccia URL per ottenere parametri di query (ovvero parametri di ricerca)

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

Puoi anche utilizzare URLSearchParams per questo, ecco un esempio di MDN per farlo con 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

Ho sviluppato una piccola libreria utilizzando le tecniche elencate qui per creare una soluzione facile da usare e da eliminare per i problemi di chiunque; Può essere trovato qui:

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

Utilizzo

Recupero di parametri/chiave specifici:

query.get('param');

Utilizzando il builder per recuperare l'intero oggetto:

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

e altre ancora ... controlla il link github per altri esempi.

Funzionalità

  1. Memorizzazione nella cache sia della decodifica che dei parametri
  2. Supporta stringhe di query hash #hello?page=3
  3. Supporta il passaggio di query personalizzate
  4. Supporta parametri array/oggetto user[]="jim"&user[]="bob"
  5. Supporta la gestione vuota &&
  6. Supporta parametri di dichiarazione senza valori name&hello="world"
  7. Supporta parametri ripetuti param=1&param=2
  8. Sorgente pulita, compatta e leggibile 4kb
  9. Supporto AMD, Require, Node
20
Nijikokun

One-liner per ottenere la query:

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

Un metodo jQuery molto leggero:

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 per avvisare, per esempio? Q

alert(request.q)
17
Roi

Ecco la mia versione del codice di analisi delle stringhe di query su GitHub .

È "prefissato" con jquery. *, Ma la funzione di analisi stessa non usa jQuery. È piuttosto veloce, ma è ancora aperto per alcune semplici ottimizzazioni delle prestazioni.

Supporta anche la codifica list & hash-table nell'URL, come:

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

o

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

Ecco cosa sto 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

Il ritorno di "override" piuttosto che "0" nell'ultimo caso lo rende coerente con PHP. Funziona in IE7.

12
Vladimir Kornea

Preferisco usare split() invece di Regex per questa operazione:

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

Per coloro che desiderano un metodo breve (con limitazioni):

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

Ottieni tutti i parametri di querystring inclusi i valori della casella di controllo (array).

Considerando l'uso corretto e normale dei parametri GET, le cose che vedo mancano, nella maggior parte delle funzioni, sono il supporto per gli array e la rimozione dei dati hash.

Quindi ho scritto questa funzione:

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 gli operatori di stenografia e while-- loop, le prestazioni dovrebbero essere molto buone.

Supporto:

  1. Valori vuoti (tasto =/tasto)
  2. Valore chiave (chiave = valore)
  3. Array (chiave [] = valore)
  4. Hash (il tag hash è diviso)

Note:

Non supporta gli array di oggetti (chiave [chiave] = valore)

Se lo spazio è + rimane un +.

Aggiungi .replace(/\+/g, " ") se ti serve.

Utilizzo:

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

Ritorno:

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

Demo:

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

Informazioni

Se non capisci qualcosa o non puoi leggere la funzione, basta chiedere. Sono felice di spiegare cosa ho fatto qui.

Se ritieni che la funzione sia illeggibile e non gestibile, sono felice di riscrivere la funzione per te, ma considera che gli stenografi e gli operatori bit a bit sono sempre più veloci di una sintassi standard (magari leggi stenografi e operatori bit a bit nell'ECMA-262 prenota o usa il tuo motore di ricerca preferito. Riscrivere il codice in una sintassi leggibile standard significa perdere le prestazioni.

10
cocco

Questo funziona bene

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];
        }
    }
}

tratto da qui

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

Questa funzione converte la querystring in un oggetto simile a JSON, gestisce anche i parametri value-less e multi-value:

"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;
}

Eseguiamo un controllo per undefined su parameter[1] perché decodeURIComponent restituisce la stringa "indefinita" se la variabile è undefined, e ciò è sbagliato.

Uso:

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

Prova questo:

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(/(&|;|$)/))) : "";
};

Quindi chiamalo così:

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

Puoi usare questo anche per cookies anche:

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

Funziona solo per le stringhe che hanno key=value[&|;|$]... non funzionerà su oggetti/array.

Se tu non vuoi usare String.prototype ... spostalo in una funzione e passa la stringa come argomento

6
user981090

Ho usato questo codice (JavaScript) per ottenere ciò che è passato attraverso l'URL:

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

Quindi per assegnare il valore a una variabile, devi solo specificare quale parametro vuoi ottenere, cioè se l'URL è example.com/?I=1&p=2&f=3

Puoi farlo per ottenere i valori:

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

allora i valori sarebbero:

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

Il codice seguente creerà un oggetto che ha due metodi:

  1. isKeyExist: controlla se esiste un parametro particolare
  2. getValue: ottiene il valore di un particolare parametro.

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

La seguente funzione restituisce una versione oggetto di queryString. Puoi semplicemente scrivere obj.key1 e obj.key2 per accedere ai valori di key1 e key2 nel parametro.

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 per usare questa funzione puoi scrivere

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

Ecco la mia opinione su questo. Questa prima funzione decodifica una stringa URL in un oggetto di coppie nome/valore:

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 come ulteriore vantaggio, se cambi alcuni degli argomenti, puoi usare questa seconda funzione per rimettere la serie di argomenti nella stringa dell'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

Ho fatto una piccola libreria di URL per le mie esigenze qui: https://github.com/Mikhus/jsurl

È un modo più comune di manipolare gli URL in JavaScript. Nel frattempo è davvero leggero (minisito e gzipato <1 KB) e ha un'API molto semplice e pulita. E non ha bisogno di altre librerie per funzionare.

Per quanto riguarda la domanda iniziale, è molto semplice da fare:

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 vuoi parametri in stile array URL.js supporta parametri di stile array arbitrariamente nidificati e indici di stringhe (mappe). Gestisce anche la decodifica degli 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

Ci sono molte soluzioni per recuperare i valori delle query URI, io preferisco questo perché è breve e funziona alla grande:

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

Una soluzione semplice con JavaScript semplice e espressioni regolari :

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

C'è una bella utility url per questo con un po 'di zucchero zuccherato:

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)

Guarda altri esempi e scarica qui: https://github.com/websanova/js-url#url

4
Rob

Questo è il più semplice e piccolo JavaScript per ottenere il valore del parametro String da 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");

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

4
Code Spy

C'è un'implementazione robusta nella fonte di Node.js
https://github.com/joyent/node/blob/master/lib/querystring.js

Anche i qs di TJ analizzano i parametri nidificati
https://github.com/visionmedia/node-querystring

4
clyfe

Se hai Underscore.js o lodash , un modo veloce e sporco per ottenere questo risultato è:

_.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

Ho preso questa risposta e ho aggiunto il supporto per passare facoltativamente l'URL come parametro; torna a window.location.search. Ovviamente questo è utile per ottenere i parametri della stringa di query dagli URL che non sono la pagina corrente:

(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

Credo che questo sia un modo accurato e conciso per ottenere questo risultato (modificato da 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

Questo è un metodo molto semplice per ottenere il valore del parametro (stringa di query)

Usa la funzione gV(para_name) per recuperare il suo valore

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 non si desidera utilizzare una libreria JavaScript, è possibile utilizzare le funzioni stringa JavaScript per analizzare window.location. Conserva questo codice in un file .js esterno e puoi utilizzarlo più e più volte in diversi progetti.

// 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

La maggior parte carina ma di base:

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

Non gestisce elenchi di valori come ?a[]=1&a[]2

3
Damien

Raccomando Lezioni di Dar come un buon plugin. Ci ho lavorato per tanto tempo. Puoi anche usare il seguente codice. Jus inserisce var queryObj = {}; prima di document.ready e inserisce il codice qui sotto all'inizio di document.ready. Dopo questo codice puoi usare queryObj["queryObjectName"] per qualsiasi oggetto di query che hai

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

L'espressione più breve possibile in termini di dimensioni per ottenere un oggetto query sembra essere:

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

È possibile utilizzare l'elemento A per analizzare un URI da una stringa nei suoi componenti location-like (per eliminare #..., ad esempio):

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

Uso:

  $(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;
      }

Per favore controlla e fammi sapere i tuoi commenti. Fai riferimento anche aCome ottenere il valore di querystring usando jQuery.

2
Pushkraj

Questo analizzerà le variabiliEarray da una stringa URL. Non usa né regex o nessuna libreria esterna.

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;
}

Esempio:

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

Produzione:

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

Questa funzione restituirà un oggetto JavaScript analizzato con qualsiasi valore annidato arbitrariamente utilizzando la ricorsione, se necessario.

Ecco un jsfiddle esempio.

[
  '?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('');

Considerato uno degli esempi di test sopra riportati.

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

Funzionerà ... Devi chiamare questa funzione dove hai bisogno di ottenere il parametro passando il suo 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

Veloce, facile e veloce:

La funzione:

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;
}

Utilizzo:

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

Ecco l'implementazione del prototipo 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];
    }
}

Chiamata di esempio:

var status = str.getParam("status")

str può essere una stringa di query o URL

1
krisrak

Vedi questo post o usa questo:

<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

Farlo in modo affidabile è più complicato di quanto si possa pensare all'inizio.

  1. location.search, che è usato in altre risposte, è fragile e dovrebbe essere evitato - per esempio, restituisce vuoto se qualcuno sbaglia e mette un identificatore #fragment prima della stringa ?query.
  2. Ci sono diversi modi in cui gli URL vengono automaticamente sfuggiti nel browser, il che rende decodeURIComponent praticamente obbligatorio, secondo me.
  3. Molte stringhe di query vengono generate dall'input dell'utente, il che significa che le ipotesi relative al contenuto dell'URL sono pessime. Includendo cose molto semplici come quella, ciascuna chiave è unica o addirittura ha un valore.

Per risolvere questo, ecco un'API configurabile con una buona dose di programmazione difensiva . Si noti che può essere ridotto della metà se si desidera eseguire l'hardcode di alcune variabili o se l'input non può mai includere hasOwnProperty, ecc.

Versione 1: Restituisce un oggetto dati con nomi e valori per ogni parametro. Dedica efficacemente la duplicazione e rispetta sempre la prima trovata da sinistra a destra.

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;
    }
}

Versione 2: Restituisce un oggetto mappa dati con due array di lunghezza identici, uno per i nomi e uno per i valori, con un indice per ciascun parametro. Questo supporta i nomi duplicati e intenzionalmente non li de-duplica, perché è probabilmente il motivo per cui si vorrebbe usare questo 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

Questo non ha funzionato per me, voglio abbinare ?b come il parametro b è presente, e non corrisponde ?return come parametro r, ecco 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