it-swarm-eu.dev

Jak mohu získat hodnoty řetězce dotazů v jazyce JavaScript?

Existuje způsob načítání dotazovacího řetězce hodnot přes jQuery (nebo bez)?

Pokud ano, jak? Pokud tomu tak není, existuje plugin, který to může udělat?

2701
Kemal Emin

Aktualizace: září-2018

Můžete použít URLSearchParams, který je jednoduchý a má dobrá podpora prohlížeče .

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

Původní

Pro tento účel nepotřebujete jQuery. Můžete použít pouze čistý 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, ' '));
}

Použití:

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


Poznámka: Pokud je parametr přítomen několikrát (?foo=lorem&foo=ipsum), dostanete první hodnotu (lorem). O tom není žádný standard a použití se liší, viz například tato otázka: Autoritativní pozice duplikovaných dotazů HTTP GET .
POZNÁMKA: Funkce rozlišuje velká a malá písmena. Pokud preferujete název parametru nerozlišující velká a malá písmena, přidat 'i' modifikátor k RegExp


Jedná se o aktualizaci založenou na nových URLSearchParams specs k dosažení stejného výsledku stručněji. Viz odpověď s názvem " URLSearchParams " níže.

7640
Artem Barger

Některá z uvedených řešení jsou neefektivní. Opakování vyhledávání regulárních výrazů pokaždé, když skript potřebuje přístup k parametru, je zcela zbytečné, stačí jedna funkce rozdělit parametry do objektu stylu asociativního pole. Pokud s rozhraním API historie historie HTML 5 nepracujete, je to nutné pouze jednou na stránku. Ostatní návrhy zde také nepodaří správně dekódovat adresu 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]);
})();

Příklad dotazovacího řetězce:

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

Výsledek:

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

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

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

To by se dalo snadno vylepšit i při zpracování řetězců dotazů ve stylu pole. Příkladem toho je zde , ale protože parametry ve stylu pole nejsou definovány v RFC 3986 Neznečišťuji tuto odpověď zdrojovým kódem. Pro zájemce o "znečištěnou" verzi, podívejte se na odpověď campbeln níže .

Jak je uvedeno v komentářích, ; je také právním oddělovačem pro páry key=value. Vyžadovalo by to složitější regex pro zpracování ; nebo &, což je podle mého názoru zbytečné, protože je to vzácné, že ; je používáno, a já bych řekl, že by bylo ještě méně pravděpodobné, že by se oba používaly. Pokud potřebujete místo ; podporovat &, stačí je přepnout do regexu.


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

Mnohem jednodušší!

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

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

S URL, jako je ?topic=123&name=query+string, se vrátí následující:

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

Metoda Google

Při rozpoznávání kódu Google jsem našel metodu, kterou používají: 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
}

Je zmatený, ale je to pochopitelné. To nefunguje, protože některé proměnné jsou nedefinovány.

Začnou hledat parametry na url z ? a také z hash #. Pak pro každý parametr, který rozdělíme do rovnice b[f][p]("=") (která vypadá jako indexOf, používají pozici znaku char pro získání klíče/hodnoty). Po jeho rozdělení zkontrolují, zda má parametr hodnotu, nebo ne, pokud má pak hodnotu d, jinak pokračují.

Nakonec je objekt d vrácen, zpracovává únik a znak +. Tento objekt je stejně jako můj, má stejné chování.


Moje metoda jako 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);

Používání

//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 výkonnosti (metoda rozdělení proti metodě regex) ( jsPerf )

Kód přípravy: metody

Rozdělit testovací kód

var qs = window.GetQueryString(query);

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

Regex testovací kód

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

Testování ve Firefoxu x86 v systému Windows Server 2008 R2/7 x64

  • Metoda rozdělení : 144,780 ± 2,17% nejrychlejší
  • Regexova metoda : 13,891 ± 0,85% | O 90% pomalejší
1244
BrunoLM

Vylepšená verze Odpověď Artem Bargera :

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

Další informace o zlepšení naleznete na adrese: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/

650
James

URLSearchParams

Aplikace Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ a Chrome 49+ podporují rozhraní URLSearchParams API:

Pro stabilní verze IE existuje google-navrženýURLSEARCHPARAMS POLYFILL.

Není standardizován W3C , ale je to životní standard WhatWG .

Můžete jej použít na místě, ale musíte odstranit otazník ? (například pomocí .slice(1)):

let params = new URLSearchParams(location.search);

nebo

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

Nebo samozřejmě na jakékoli adrese URL:

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

Parametry můžete získat také pomocí zkratkové .searchParams vlastnosti objektu URL, jako je tento:

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

Čte/nastavujete parametry pomocí rozhraní get(KEY), set(KEY, VALUE), append(KEY, VALUE) API. Můžete také iterovat všechny hodnoty for (let p of params) {}.

A referenční implementace a a ukázková stránka jsou k dispozici pro auditování a testování.

541
Paul Sweatte

Jen další doporučení. PluginPurlumožňuje načíst všechny části adresy URL, včetně kotvy, hostitele atd.

Lze použít s nebo bez jQuery.

Použití je velmi jednoduché a cool:

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'

Od 11. listopadu 2014 se však Purl již neudržuje a autor doporučuje místo toho použít URI.js . Plugin jQuery je odlišný v tom, že se zaměřuje na elementy - pro použití s ​​řetězci stačí použít URI přímo, s nebo bez jQuery. Podobný kód by vypadal jako takový, plnější dokumenty zde :

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

Rychlé kompletní řešení , které zpracovává vícehodnotové klávesy a kódované znaky .

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

Co je to za celý tento kód ...
"null-coalescing" , vyhodnocení zkratu
ES6 Destruktivní přiřazení , Arrow funkce , Šablony řetězců

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



Přečtěte si více ... o řešení Vanilla JavaScript.

Pro přístup k různým částem adresy URL použijte location.(search|hash)

Nejjednodušší (fiktivní) řešení

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
  • Rukojeti prázdné klíče správně.
  • Přepíše více klíčůposlední nalezená hodnota.
"?a=1&b=0&c=3&d&e&a=5"
> queryDict
a: "5"
b: "0"
c: "3"
d: undefined
e: undefined

Vícehodnotové klíče

Jednoduchá kontrola klíčů (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]]})
  • Nyní se vrací pole místo toho.
  • Přístupové hodnoty pomocí qd.key[index] nebo qd[key][index]
> qd
a: ["1", "5"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined]

Kódované znaky?

Použijte decodeURIComponent() pro druhé nebo oba rozdělení.

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



Z komentářů

* !!! Vezměte prosím na vědomí, že decodeURIComponent(undefined) vrací řetězec "undefined". Řešení spočívá v jednoduchém použití && , což zajišťuje, že decodeURIComponent() není voláno na nedefinovaných hodnotách. (Viz "kompletní řešení" nahoře.)

v = v && decodeURIComponent(v);


Pokud je dotazový řetězec prázdný (location.search == ""), výsledek je poněkud zavádějící qd == {"": undefined}. Doporučujeme zkontrolovat dotazovací řetězec před spuštěním syntaktické funkce likeso:

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

Roshambo na snipplr.com má jednoduchý skript k dosažení tohoto cíle popsaného vZískat URL parametry s jQuery | Vylepšeno. S jeho scénářem můžete také snadno vytáhnout jen požadované parametry.

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

Pak stačí získat parametry z řetězce dotazu.

Pokud tedy byl řetězec URL/dotazu xyz.com/index.html?lang=de.

Stačí zavolat var langval = $.urlParam('lang'); a máte to.

UZBEKJON má také skvělý blogový příspěvek,Získání parametrů a hodnot URL pomocí jQuery.

216
brandonjp

Pokud používáte jQuery, můžete použít knihovnu, např. jQuery BBQ: Back Button & Query Library .

... jQuery BBQ poskytuje úplnou metodu .deparam() spolu s řízením stavu hash a fragmentem/dotazem pro analýzu a slučovací metody.

Upravit: Přidání příkladu aplikace 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();
                  
            }
        };

Pokud chcete používat prostý JavaScript, můžete použít ...

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

})();​

Díky novému rozhraní API historie HTML a specificky history.pushState() a history.replaceState() se může adresa URL změnit, což zneplatní mezipaměť parametrů a jejich hodnot.

Tato verze bude aktualizovat interní mezipaměť parametrů při každé změně historie.

165
alex

Stačí použít dva rozdělení :

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

Četl jsem všechny předchozí a úplnější odpovědi. Ale myslím si, že je to nejjednodušší a rychlejší metoda. Můžete zkontrolovat tento jsPerf benchmark

Chcete-li vyřešit problém v komentáři Rup, přidejte podmíněné rozdělení změnou prvního řádku na dva níže. Ale absolutní přesnost znamená, že je nyní pomalejší než regexp (viz 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;
}

Takže pokud víte, že se nedostanete do Rupova protipřípadu, vyhrává to. Jinak regexp.

Or pokud máte kontrolu nad querystringem a můžete zaručit, že hodnota, kterou se snažíte získat, nikdy nebude obsahovat žádné znaky kódované pomocí URL (tyto hodnoty by byly špatným nápadem) - můžete použít následující o něco jednodušší a čitelnější verze 1. možnosti:

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

Tady je moje bodnutí, když dělám Andy E vynikající řešení do plnohodnotného pluginu 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);

Syntaxe je:

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

Nejlepší z obou světů!

94
Ryan Phelan

Pokud provádíte více manipulace s adresami URL než jednoduchou analýzu dotazovacího řetězce, můžete najít URI.js nápomocný. Je to knihovna pro manipulaci s adresami URL - a přichází se všemi zvonky a píšťalkami. (Omlouváme se za vlastní reklamu zde)

převést dotazovací řetězec na mapu:

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

(URI.js také "opravuje" špatné dotazy, například ?&foo&&bar=baz& na ?foo&bar=baz)

76
rodneyrehm

Mám rád řešení Ryana Phelana . Ale nevidím žádný bod rozšíření jQuery za to? Funkce jQuery se nepoužívá.

Na druhou stranu se mi líbí vestavěná funkce v prohlížeči Google Chrome: window.location.getParameter.

Tak proč to nepoužívat? Dobře, ostatní prohlížeče nemají. Vytvořme tedy tuto funkci, pokud neexistuje:

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

Tato funkce je víceméně od Ryana Phelana, ale je zabalena jinak: jasné jméno a žádné závislosti jiných knihoven javascriptu. Více o této funkci na mém blogu .

59
Anatoly Mironov

Zde je rychlý způsob, jak získat objekt podobný 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;
}

Používání:

var $_GET = get_query();

Pro řetězec dotazu x=5&y&z=hello&x=6 vrací objekt:

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

Jednoduchý JavaScript kód:

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

Volejte jej odkudkoli v kódu JavaScriptu:

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

To vše jsou skvělé odpovědi, ale potřeboval jsem něco trochu robustnějšího a myslel jsem, že všichni byste chtěli mít to, co jsem vytvořil.

Jedná se o jednoduchou knihovní metodu, která provádí disekce a manipulaci s parametry URL. Statická metoda má následující dílčí metody, které lze vyvolat na adrese URL předmětu:

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

Příklad:

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

Z MDN :

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

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

Používám regulární výrazy hodně, ale ne pro to.

Zdá se mi jednodušší a efektivnější číst řetězec dotazu jednou v aplikaci a vytvořit objekt ze všech párů klíčů/hodnot jako:

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

Pro adresu URL jako http://domain.com?param1=val1&param2=val2 můžete získat její hodnotu později v kódu jako search.param1 a search.param2.

39
Mic

Kód 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]);
}

Zobrazit!

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

Na mém počítači Mac: test.htm?i=can&has=cheezburger displeje

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

Metoda Roshambo jQuery se nezabývala dekódováním URL

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

Jen přidal tuto schopnost také při přidávání v návratu prohlášení

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

Nyní můžete najít aktualizovaný Gist:

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

Mám rád tohle (převzato z 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;
}

Pracuje skvěle pro mě.

36
Tomamais

Zde je moje editace tato vynikající odpověď - s přidanou schopností analyzovat dotazové řetězce s klíči bez hodnot.

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

DŮLEŽITÉ! Parametr pro tuto funkci v posledním řádku je jiný. Je to jen příklad toho, jak na něj lze předat libovolnou adresu URL. Poslední řádek z Brunoovy odpovědi můžete použít k analýze aktuální adresy URL.

Co se přesně změnilo? S url http://sb.com/reg/step1?param= výsledky budou stejné. Ale s url http://sb.com/reg/step1?param Brunovo řešení vrací objekt bez klíčů, zatímco moje vrací objekt s hodnotou param a undefined.

36
skaurus

Potřeboval jsem objekt z řetězce dotazů a nesnáším spoustu kódu. Ve vesmíru to nemusí být nejrobustnější, ale je to jen pár řádků kódu.

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

Adresa URL jako this.htm?hello=world&foo=bar vytvoří:

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

Zde je rozšířená verze propojených Andy E "Handle array-style query string" - konverze. Opravena chyba (?key=1&key[]=2&key[]=3; 1 je ztracena a nahrazena [2,3]), provedla několik drobných vylepšení výkonu (re-dekódování hodnot, přepočítání pozice "[", atd.) A přidala řadu vylepšení (funkcionalizovaná, podpora ?key=1&key=2, podpora oddělovačů ;). Nechal jsem proměnné nepříjemně krátké, ale přidal komentáře habaděj, aby byly čitelné (oh, a já jsem znovu použil v v rámci místních funkcí, omlouvám se, pokud je to matoucí;).

Bude zpracovávat následující dotazovací řetězec ...

? test = Dobrý den & person = neek & person [] = jeff & person [] = jim & person [extra] = john & test3 & nocache = 1398914891264

... dělat to do objektu, který vypadá jako ...

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

Jak vidíte výše, tato verze zpracovává určité míry "chybně tvarovaných" polí, tj. person=neek&person[]=jeff&person[]=jim nebo person=neek&person=jeff&person=jim jako klíč je identifikovatelný a platný (alespoň v dotNet NameValueCollection.Add ):

Pokud zadaný klíč již existuje v cílové instanci NameValueCollection, zadaná hodnota se přidá do existujícího seznamu hodnot ve tvaru "value1, value2, value3", oddělených čárkami.

Vypadá to porota je poněkud mimo na opakovaných klávesách, protože neexistuje žádná specifikace. V tomto případě je více klíčů uloženo jako (falešné) pole. Všimněte si však, že I ne / zpracovávají hodnoty založené na čárkách do polí.

Kód:

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

Tohle je funkce, kterou jsem vytvořil, a jsem docela spokojený. Není citlivý na velikost písmen - což je užitečné. Také pokud požadovaný QS neexistuje, vrátí pouze prázdný řetězec.

Používám komprimovanou verzi tohoto. Vysílám nekomprimované pro začínající typy, abych lépe vysvětlil, co se děje.

Jsem si jistý, že by to mohlo být optimalizováno nebo uděláno jinak, aby fungovalo rychleji, ale vždy to bylo skvělé pro to, co potřebuji.

Užívat si.

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

Právě jsme vydali arg.js , projekt zaměřený na řešení tohoto problému jednou provždy. Tradičně to bylo tak těžké, ale teď můžete udělat:

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

nebo dostat celou partii:

var params = Arg.all();

a pokud vám záleží na rozdílu mezi ?query=true a #hash=true, můžete použít metody Arg.query() a Arg.hash().

27
Mat Ryer

Problém s top odpověď na tuto otázku je, že to není podporované parametry umístěny po #, ale někdy je třeba získat tuto hodnotu také.

Odpověď jsem upravila tak, aby mohla analyzovat celý řetězec dotazů znakem hašování také:

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

A to je způsob, jak můžete tuto funkci použít za předpokladu, že URL je

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
  • Pravidelný pár klíčů/hodnot (?param=value)
  • Klíče w/o hodnota (?param: žádné stejné znaménko nebo hodnota)
  • Klávesy w/prázdná hodnota (?param=: znaménko rovná se, ale žádná hodnota vpravo od znaménka rovnosti)
  • Opakované klíče (?param=1&param=2)
  • Odstraní prázdné klíče (?&&: žádný klíč nebo hodnota)

Kód:

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

Jak volat:

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

Výstup:

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

Pokud používáte Browserify, můžete použít modul url z Node.js:

var url = require('url');

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

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

Další čtení: URL Node.js v0.12.2 Manuál a dokumentace

EDIT: Můžete použít URL interface, jeho poměrně široce přijatý téměř ve všech nových prohlížečích a pokud se kód bude spouštět ve starém prohlížeči, můžete použít polyfill like toto . Zde je příklad kódu, jak používat rozhraní URL k získání parametrů dotazu (aka parametry hledání)

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

Můžete také použít URLSearchParams pro to, zde je příklad z MDN to udělat s 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

Vyvinula jsem malou knihovnu pomocí zde uvedených technik, abych vytvořila snadno použitelné řešení typu drop-in, které by umožňovalo řešení problémů. Naleznete zde:

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

Použití

Načítání specifického parametru/klíče:

query.get('param');

Použití tvůrce k načtení celého objektu:

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

a více tun ... více odkazů naleznete v odkazu github.

Funkce

  1. Ukládání do mezipaměti jak na dekódování, tak na parametry
  2. Podporuje řetězce dotazů hash #hello?page=3
  3. Podporuje předávání vlastních dotazů
  4. Podporuje parametry pole/objektu user[]="jim"&user[]="bob"
  5. Podporuje prázdnou správu &&
  6. Podporuje parametry deklarace bez hodnot name&hello="world"
  7. Podporuje opakované parametry param=1&param=2
  8. Čistý, kompaktní a čitelný zdroj 4kb
  9. AMD, Require, Podpora uzlu
20
Nijikokun

Chcete-li získat dotaz, použijte linku:

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

Velmi lehká metoda 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);

A upozornit, například? Q

alert(request.q)
17
Roi

Zde je moje verze kódu analýzy dotazovacího řetězce na GitHub .

Je to "prefixed" s jquery. *, Ale funkce analýzy sama o sobě nepoužívá jQuery. Je to docela rychlé, ale stále otevřené pro několik jednoduchých optimalizací výkonu.

Podporuje také kódování seznamu a hash tabulek v adrese URL, jako například:

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

nebo

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

Zde používám:

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

Vrátit 'přepsání' namísto '0' v posledním případě je v souladu s PHP. Pracuje v IE7.

12
Vladimir Kornea

Pro tuto operaci bych raději použil split() místo Regexu:

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

Pro ty, kteří chtějí krátkou metodu (s omezením):

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

Získejte všechny parametry dotazovacího řetězce včetně hodnot zaškrtávacích polí (polí).

Vzhledem k správnému a normálnímu používání parametrů GET, které vidím, že chybí, na většině funkcí, je podpora pro pole a odstraňování hašovacích dat.

Tak jsem tuto funkci napsal:

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
}

Použití zkrácených operátorů & zatímco-- smyčka, výkon by měl být velmi dobrý.

Podpora:

  1. Prázdné hodnoty (klíč =/klíč)
  2. Hodnota klíče (klíč = hodnota)
  3. Pole (klíč [] = hodnota)
  4. Hash (hash tag je rozdělen)

Poznámky:

Nepodporuje pole objektů (klíč [klíč] = hodnota)

Pokud je místo +, zůstává +.

Pokud potřebujete, přidejte .replace(/\+/g, " ").

Použití:

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

Vrátit:

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

Demo:

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

Info

Pokud něco nechápete nebo nemůžete číst tuto funkci, zeptejte se. Jsem rád, že jsem vám vysvětlil, co jsem tu udělal.

Pokud si myslíte, že funkce je nečitelná a neudržitelná, ráda vám tuto funkci přepíšu, ale domnívám se, že zkrácené a bitové operátory jsou vždy rychlejší než standardní syntaxe (možná se dočtete o zkratkách a bitových operátorech v ECMA-262) Přepište kód do standardní čitelné syntaxe znamená ztrátu výkonu.

10
cocco

Toto funguje dobře

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

převzato z zde

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

Tato funkce převádí dotazovací řetězec na objekt podobný JSON, zpracovává také hodnoty bez hodnot a více hodnot:

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

Provádíme kontrolu undefined na parameter[1], protože decodeURIComponent vrací řetězec "undefined", pokud je proměnná undefined, a to je špatně.

Používání:

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

Zkuste to:

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

Pak to zavolejte takto:

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

Můžete to použít pro cookies také:

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

Toto funguje pouze pro řetězce, které mají key=value[&|;|$]... nebude fungovat na objektech/polích.

Pokud nechcete chcete použít String.prototype ... přesuňte jej do funkce a předejte řetězec jako argument

6
user981090

Tento kód (JavaScript) jsem použil (a), abych získal (a) to, co prošlo adresou URL:

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

Pak přiřadit hodnotu proměnné, stačí zadat, který parametr chcete získat, tj. Pokud je adresa URL example.com/?I=1&p=2&f=3

Můžete to provést tak, abyste získali hodnoty:

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

pak by hodnoty byly:

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

Následující kód vytvoří objekt, který má dvě metody:

  1. isKeyExist: Zkontrolujte, zda existuje určitý parametr
  2. getValue: Získání hodnoty určitého parametru.

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

Následující funkce vrátí objektovou verzi dotazu. Můžete jednoduše napsat obj.key1 a obj.key2 pro přístup k hodnotám key1 a key2 v parametru.

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

A pro použití této funkce můžete psát

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

Tady je můj vlastní názor. Tato první funkce dekóduje řetězec URL do objektu párů jméno/hodnota:

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

Jako bonus navíc, pokud změníte některé z args, můžete použít tuto druhou funkci, aby se pole args vrátilo do řetězce 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

Udělal jsem malou knihovnu URL pro mé potřeby zde: https://github.com/Mikhus/jsurl

Je to běžnější způsob manipulace s adresami URL v jazyce JavaScript. Mezitím je to opravdu lehké (minified a gzipped <1 KB) a má velmi jednoduché a čisté API. A k práci nepotřebuje žádnou jinou knihovnu.

Co se týče první otázky, je to velmi jednoduché:

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

Pokud chcete, aby parametry ve stylu pole URL.js podporovaly libovolně vnořené parametry ve stylu pole, stejně jako indexy řetězců (mapy). To také zpracovává URL dekódování.

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

Existuje mnoho řešení pro načtení hodnot dotazu URI, dávám přednost tomuto, protože je krátký a funguje skvěle:

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

Jednoduché řešení s prostým JavaScriptem a regulárními výrazy :

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

Pro tento účel je k dispozici pěkný malý url nástroj:

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)

Podívejte se na další příklady a ke stažení zde: https://github.com/websanova/js-url#url

4
Rob

Toto je nejjednodušší a nejmenší funkce JavaScriptu, jak dostat int ans hodnotu parametru řetězce z 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");

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

4
Code Spy

Ve zdroji Node.js existuje robustní implementace
https://github.com/joyent/node/blob/master/lib/querystring.js

Také qs TJ má vnořené params parsování
https://github.com/visionmedia/node-querystring

4
clyfe

Pokud máte Underscore.js nebo lodash , rychlý a špinavý způsob, jak toho dosáhnout, je:

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

Vzal jsem tuto odpověď a přidal podporu pro volitelné předávání URL jako parametr; spadá zpět do window.location.search. Je to samozřejmě užitečné pro získání parametrů řetězce dotazů z adres URL, které nejsou aktuální stránkou:

(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

Domnívám se, že je to přesný a výstižný způsob, jak toho dosáhnout (upraveno z 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

Toto je velmi jednoduchá metoda, jak získat hodnotu parametru (řetězec dotazu)

Použijte funkci gV(para_name) pro načtení její hodnoty

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

Pokud si nepřejete používat knihovnu JavaScript, můžete použít funkce řetězců JavaScript k analýze window.location. Tento kód uchovávejte v externím souboru .js a můžete jej používat znovu a znovu v různých projektech.

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

Nejvíce pěkné, ale základní:

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

Nezpracovává seznamy hodnot, jako je ?a[]=1&a[]2

3
Damien

Doporučuji Dar Lessons jako dobrý plugin. Dlouho jsem s ním pracoval. Můžete také použít následující kód. Jus dal var queryObj = {}; před document.ready a vložil níže uvedený kód na začátek document.ready. Po tomto kódu můžete použít queryObj["queryObjectName"] pro libovolný objekt dotazu, který máte

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

Zdá se, že nejkratší možný výraz z hlediska velikosti pro získání objektu dotazu je:

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

Pomocí prvku A můžete analyzovat identifikátor URI z řetězce do jeho location- podobných komponent (například k odstranění #...):

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

Použití:

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

Zkontrolujte prosím své připomínky. Viz takéJak získat hodnotu dotazovacího řetězce pomocí jQuery.

2
Pushkraj

To bude analyzovat proměnnéAarrays z řetězce URL. Používá ani regex nebo žádnou externí knihovnu.

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

Příklad:

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

Výstup:

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

Tato funkce vrátí analyzovaný objekt JavaScript s libovolnými libovolně vnořenými hodnotami pomocí rekurze.

Zde je jsfiddle příklad.

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

Vzhledem k některému z výše uvedených příkladů zkoušek.

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

To bude fungovat ... Musíte zavolat tuto funkci, kde potřebujete získat parametr předáním jeho jména ...

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

Rychlé, snadné a rychlé:

Funkce:

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

Použití:

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

Zde je String implementace prototypu:

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

Příklad volání:

var status = str.getParam("status")

str může být řetězec dotazu nebo adresa URL

1
krisrak

Viz post nebo použijte toto:

<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

Dělat toto spolehlivě je více zapojený než jeden může myslet nejprve.

  1. location.search, který se používá v jiných odpovědích, je křehký a měl by se mu vyhnout - například se vrátí prázdný, pokud někdo zašroubuje a vloží identifikátor #fragment před řetězec ?query.
  2. Existuje celá řada způsobů, jakými URL adresy automaticky unikly v prohlížeči, což je podle mého názoru decodeURIComponent do značné míry povinné.
  3. Mnoho dotazových řetězců je generováno z uživatelského vstupu, což znamená, že předpoklady o obsahu URL jsou velmi špatné. Včetně velmi základních věcí, jako je každý klíč jedinečný nebo dokonce má hodnotu.

K vyřešení tohoto problému je zde konfigurovatelné API se zdravou dávkou obranného programování . Všimněte si, že může být provedena poloviční velikost, pokud jste ochotni kódovat některé z proměnných, nebo pokud vstup nemůže nikdy obsahovat hasOwnProperty atd.

Verze 1: Vrátí datový objekt s názvy a hodnotami pro každý parametr. Efektivně je duplikuje a vždy respektuje první nalezený zleva doprava.

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

Verze 2: / Vrátí objekt datové mapy se dvěma identickými délkovými poli, jeden pro názvy a jeden pro hodnoty, s indexem pro každý parametr. Tento podporuje duplicitní jména a úmyslně je nedeplikuje, protože to je pravděpodobně důvod, proč byste chtěli tento formát použít.

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

Toto nefungovalo pro mě, chci odpovídat ?b, protože parametr b je přítomen, a neodpovídá ?return jako parametr r, zde je moje řešení .

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