Jak uzyskać wartość z parametrów GET?

1326

Mam adres URL z niektórymi parametrami GET w następujący sposób:

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

Muszę uzyskać całą wartość c. Próbowałem odczytać adres URL, ale dostałem tylko m2. Jak to zrobić za pomocą JavaScript?

Joe
źródło
Zanim opublikujesz nową odpowiedź, zastanów się, że istnieje już ponad 50 odpowiedzi na to pytanie. Upewnij się, że twoja odpowiedź zawiera informacje, których nie ma wśród odpowiedzi istniejących.
janniks

Odpowiedzi:

1997

Sam JavaScript nie ma nic wbudowanego do obsługi parametrów ciągu zapytania.

Kod działający w (nowoczesnej) przeglądarce można użyć URLobiektu (który jest częścią interfejsów API udostępnianych przez przeglądarki JS):

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


W przypadku starszych przeglądarek (w tym Internet Explorera) możesz użyć tego wypełnienia lub kodu z oryginalnej wersji tej odpowiedzi, która poprzedza URL:

Możesz uzyskać dostęp location.search, co da ci ?znak od końca do adresu URL lub początku identyfikatora fragmentu (#foo), w zależności od tego, co nastąpi wcześniej.

Następnie możesz to przeanalizować za pomocą tego:

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

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

Możesz pobrać ciąg zapytania z adresu URL bieżącej strony za pomocą:

var query = window.location.search.substring(1);
var qs = parse_query_string(query);
Quentin
źródło
W przypadku starszych przeglądarek może być potrzebny dodatek wypełniającyURL oprócz tego dla URLSearchParams. Możesz też uniknąć tego problemu, zastępując wiersz var c = url.searchParams.get("c");w powyższej odpowiedzi słowem var c = new URLSearchParams(window.location.search).get("c");.
evanrmurphy
parse_query_string zakończy się niepowodzeniem dla wartości zawierających „=”, tak jak przy przekazywaniu wartości zakodowanej w standardzie base64. Poniższa wersja z regularną ekspresją działa lepiej.
Manel Clos
7
@Jamland - Absolutnie tego nie rób. Rozbije to wszystko. Oto demo na żywo new URL() oczekuje, że otrzyma poprawnie zakodowany adres URL jako argument. decodeURIComponentoczekuje, że zostanie przekazany składnik adresu URL, a nie cały adres URL.
Quentin,
@Quentin Sprawdziłem różne znaki specjalne i widzę, że masz rację. decodeURIComponentnie należy stosować w tym przypadku
Jamland
1
parse_query_stringFunkcja robi podwójnego dekodowania value. =Wydane wymienić @ManelClos można rozwiązać przez dodanie drugiego parametru 2( limit) do vars[i].split().
Jake,
242

Większość implementacji, które widziałem, pomija dekodowanie adresów URL nazw i wartości.

Oto ogólna funkcja narzędziowa, która również poprawnie dekoduje adresy URL:

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

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

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

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);
Ates Goral
źródło
3
Ten kod nie działa. Tworzy nieskończoną pętlę, ponieważ wyrażenie regularne jest kompilowane w definicji pętli, która resetuje bieżący indeks. Działa poprawnie, jeśli umieścisz regex w zmiennej poza pętlą.
maxhawkins,
2
@maxhawkins: Działa w niektórych przeglądarkach, podczas gdy w innych przechodzi w nieskończoną pętlę. Masz rację w tym względzie. Naprawię kod, aby był przeglądarką. Dzięki za zwrócenie na to uwagi!
Ates Goral
3
@ZiTAL Z tej funkcji należy korzystać w części zapytania adresu URL, a nie w całym adresie URL. Zobacz skomentowany przykład użycia poniżej.
Ates Goral
1
@Harvey Niewrażliwość na wielkość liter nie dotyczy parametrów zapytania. Brzmi jak specyficzna dla aplikacji rzecz, którą należy zastosować wraz z ekstrakcją parametru zapytania lub poza nim.
Ates Goral
7
Dlaczego qs.split('+').join(' ');nie qs.replace(/\+/g, ' ');?
FlameStorm
234

źródło

function gup( name, url ) {
    if (!url) url = location.href;
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( url );
    return results == null ? null : results[1];
}
gup('q', 'hxxp://example.com/?q=abc')
Haim Evgi
źródło
8
Najbardziej podoba mi się ta opcja, ale wolę zwracać null lub wynik, ale nie pusty ciąg.
Jason Thrasher,
1
Wygląda na to, że masz dodatkowe znaki ucieczki. "\\[" Powinien być "\[". Ponieważ są to ciągi standardowe, nie trzeba uciekać przed [i].
EricP
To nie rozróżnia wielkości liter. Gdzie dodać „i”, aby rozróżnić wielkość liter?
zeta
alert (gup („UserID”, window.location.href));
Arun Prasad ES
6
@mottie dead link
invot
202

Jest to prosty sposób na sprawdzenie tylko jednego parametru:

Przykładowy adres URL:

    http://myserver/action?myParam=2

Przykładowy Javascript:

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

jeśli w adresie URL istnieje „myParam”… zmienna myParam będzie zawierać „2”, w przeciwnym razie będzie niezdefiniowana.

Być może chcesz domyślną wartość, w takim przypadku:

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

Aktualizacja: Działa to lepiej:

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

I działa poprawnie, nawet jeśli adres URL jest pełen parametrów.

mzalazar
źródło
36
Działa to tylko wtedy, gdy parametr, który pobierasz, jest ostatnim w adresie URL, od którego nie powinieneś polegać (nawet jeśli oczekujesz tylko jednego parametru). np. http://myserver/action?myParam=2&anotherParam=3dałby nie, "2"ale "2&anotherParam=3".
Lodowce
39
(location.search.split('myParam=')[1]||'').split('&')[0]- do użycia z wieloma parametrami lub ewentualnie brakującymi myParam .
Gábor Imre
lublocation.search.split('myParam=').splice(1).join('').split('&')[0]
J.Steve,
1
Możesz uzyskać większą precyzję i zezwolić na dowolną kolejność parametrów, przygotowując z [?|&]jak w[?|&]myParam=([^&]+)
1.21 gigawatów
1
Być może trzeba będzie zdekodować wartośćresult = decodeURIComponent(result);
1,21 gigawata
126

Dostawcy przeglądarek zaimplementowali natywny sposób, aby to zrobić za pomocą URL i URLSearchParams.

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

Obecnie obsługiwany w Firefox, Opera, Safari, Chrome i Edge. Lista obsługiwanych przeglądarek znajduje się tutaj .

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

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

Eric Bidelman, inżynier z Google, zaleca stosowanie tego wypełnienia w nieobsługiwanych przeglądarkach.

Cgatian
źródło
Zgodnie z linkami MDN adres URL obsługi Safari, ale nie URLSearchParams.
Mark Thomson,
3
@ Markouver Czy polyfill nie zajmuje się tym? BTW, Safari to współczesna wersja IE6
Csaba Toth
Dlaczego do mnie new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')wraca null? (W stabilnym Chrome). bi cwydaje się, że działa dobrze.
ripper234
Zaktualizowana odpowiedź. Moja pierwotna odpowiedź nie zawierała poprawnie adresu URLSearchParams, ponieważ została zaprojektowana tylko do pracy z pytającą częścią adresu URL.
cgatian
1
Użyj url.searchParamszamiast tego new URLSearchParams(url.search).
Caio Tarifa
86

Znalazłem to wieki temu, bardzo łatwe:

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

Następnie nazwij to tak:

var fType = getUrlVars()["type"];
VaMoose
źródło
7
+1 świetne rozwiązanie - elegancki, wydajny i inteligentny to warunki użytkowania. Dla moich celów lepiej niż inne przyjęte rozwiązanie
Elemental
krótki + prosty + potężny = świetny
mzy
1
Bardzo fajnie, działa również przy użyciu location.search zamiast window.location.href
Fabio C.
1
@pdxbmw Jest to bezużyteczne i powinno zostać usunięte. Na pierwszy rzut oka kod może wydawać się sprytny, ale nie jest zbyt dobrze przemyślany. Ulepszenia: Użyj decodeURIComponent()na wartości, ponieważ z tym zwykle chcesz pracować; użyj window.location.searchzamiast window.location.href, ponieważ interesują Cię tylko parametry, a nie cały adres URL.
Leif
2
Sugestia @Leif działała świetnie. Dostawałem identyfikator 142 #, ponieważ na końcu adresu URL był # generowany po kliknięciu przycisku. Pozostawiając taką funkcjęvar vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Andres Ramos
77

Możesz pobrać ciąg zapytania location.search, a następnie możesz podzielić wszystko po znaku zapytania:

var params = {};

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

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

// Now you can get the parameters you want like so:
var abc = params.abc;
Blixt
źródło
3
A co z dekodowaniem adresów URL nazw i wartości parametrów?
Ates Goral
To podejście nie obsługuje tablic. Np. ?array[]=1&array[]=2Produkuje {"array[]": "2"}, co jest wyraźnie błędne.
Kafoso,
@Kafoso Nie ma tu wyraźnego dobra ani zła. Po pierwsze, powtarzające się pola o tych samych nazwach nie mają określonego standardowego zachowania i zależy od parsera do obsługi. Dodatkowo []wzorzec ma znaczenie tylko w niektórych przypadkach (np. PHP), ale nie w innych. Więc nie „wyraźnie źle” - po prostu nie został zaimplementowany do obsługi niestandardowych przypadków, które możesz, ale nie musisz, obsługiwać.
Blixt,
38

Napisałem prostsze i eleganckie rozwiązanie.

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];
Natus Drew
źródło
Spójrz na to, dwie linie, robi dokładnie to, co jest napisane na puszce - i nie zepsuje się, jeśli ktoś spróbuje zbadać podatność na zagrożenia, i doda kilka dodatkowych znaków i zapytań w przeciwieństwie do kilku z tych rozwiązań. Na zdrowie facet!
David G,
Robi to dobrze i tylko w 2 liniach. Świetna odpowiedź!
Andres Ramos,
Wydaje mi się, że przydałoby się to dla innych, ponieważ uwzględniono czek zerowy. Jeśli nie, przykład jest tutaj: stackoverflow.com/a/36076822/1945948 (odrzucono próbę edycji).
atw
Nie rozumiem ... jak to odpowiada na pytanie, które dotyczy uzyskania params z określonego ciągu, „www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5”?
Mike Rodent
Bardzo podobała mi się ta odpowiedź, +1. Tylko sugestia, można wymienić [0-9] na\d
gmanjon
31

Bardzo prosty sposób za pomocą URLSearchParams .

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

Jest obecnie obsługiwany w Chrome, Firefox, Safari, Edge i innych .

spencer.sm
źródło
Uzyskaj błąd: „SCRIPT5009:„ URLSearchParams ”nie jest zdefiniowany” podczas działania w Edge.
Andreas Presthammer,
@AndreasPresthammer Jaka wersja Edge?
spencer.sm
@ spencer-sm Microsoft Edge 41.16299.820.0
Andreas Presthammer,
Nie działa z określonymi parametrami adresów URL
ii iml0sto1
@ iiiml0sto1 Co to są „wstępnie zapisane parametry adresu URL”?
spencer.sm
30

Oto rekurencyjne rozwiązanie, które nie ma wyrażenia regularnego i ma minimalną mutację (mutowany jest tylko obiekt params, co moim zdaniem jest nieuniknione w JS).

To niesamowite, ponieważ:

  • Jest rekurencyjny
  • Obsługuje wiele parametrów o tej samej nazwie
  • Dobrze radzi sobie ze źle sformułowanymi ciągami parametrów (brakujące wartości itd.)
  • Nie pęka, jeśli wartość „=” jest podana
  • Wykonuje dekodowanie adresu URL
  • I wreszcie, jest niesamowity, ponieważ ... argh !!!

Kod:

var get_params = function(search_string) {

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

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

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

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

var params = get_params(location.search);

// Finally, to get the param you want
params['c'];
Jai
źródło
31
Ty ... dwa razy powiedziałeś rekurencyjny.
Dissident Rage
Nie można znaleźć pierwszego parametru w następnym
adresie
Cześć Mario, oto JSFiddle pokazujący, że działa z tym adresem URL: jsfiddle.net/q6xfJ - Jeśli znalazłeś błąd, to może jest on specyficzny dla przeglądarki? Podczas testowania należy pamiętać, że podana przeze mnie odpowiedź korzysta z location.search, czyli części „? First = 1 i second = 2” adresu URL. Na zdrowie :)
Jai
45
Nie rozumiem, dlaczego coś jest dobre tylko dlatego, że jest rekurencyjne.
Adam Arold,
6
Emm, myślę, że przegapiłeś żart rekurencyjny tam Adam. Chociaż teraz wszyscy będą tęsknić, ponieważ edi9999 usunął drugi komunikat „Jest rekurencyjny”.
Jai
27

Stworzyłem funkcję, która to robi:

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

Aktualizacja 26.05.2017, oto implementacja ES7 (działa ze wstępnie ustawionymi etapami 0, 1, 2 lub 3 w Babel):

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

Niektóre testy:

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

Aktualizacja 26.03.2018, oto implementacja maszynopisu:

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

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

Aktualizacja 13.02.2019, oto zaktualizowana implementacja TypeScript, która współpracuje z TypeScript 3.

interface IParams { [key: string]: string }

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

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

const getUrlParams = (search: string): IParams =>
  `${search}?`.split('?')[1].split('&').reduce<IParams>(paramReducer, {})
Nate Ferrero
źródło
W przypadku adresu URL bez parametrów zapytania to się zwróciObject {"": ""}
Ilya Semenov
2
Wydaje mi się wystarczająco czysty. Reszta odpowiedzi to po prostu zbyt „magia” bez wystarczającego wyjaśnienia.
Levi Roberts
To niesamowita odpowiedź!
Spencer Bigum
Dzięki @SpencerBigum!
Nate Ferrero,
24

Zobacz

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

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

        for (i=0; i<arrURLParams.length; i++)
        {
            if (arrParamNames[i] == paramName)
            {
                //alert("Parameter:" + arrParamValues[i]);
                return arrParamValues[i];
            }
        }
        return "No Parameters Found";
    }
}
Dhiral Pandya
źródło
1
Dzięki. Jestem nowy w jscript i to będzie bardzo pomocne.
Brian B.,
20

Rozwiązanie ECMAScript 6:

var params = window.location.search
  .substring(1)
  .split("&")
  .map(v => v.split("="))
  .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())
veiset
źródło
Miły. Do twojej wiadomości, ponieważ jest to mapa, użycie jest params.get („klucz”);
evanmcd
Podoba mi się, ale prawdopodobnie nie otrzyma pierwszego parametru. Stworzyłem funkcję na podstawie twojego przykładu function urlParams(url) { const [, searchParams = ''] = url.split('?') return searchParams.split('&') .map(v => v.split('=')) .reduce((map, [key = '', value]) => key.length ? map.set(key, decodeURIComponent(value)) : map, new Map()) }
mah.cr
11

używam

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}
Fancyoung
źródło
Dodaj wyjaśnienie. Twoja odpowiedź jest obecnie oznaczona jako „niskiej jakości” i może zostać ostatecznie usunięta.
Johannes Jander
Odkryłem, że jeśli na końcu adresu URL znajduje się ciąg „#id”, i zwracam ostatnią wartość parametru, np. „Somevalue # id”
Ayano
@Ayano window.location.searchnie będzie zawierać skrótu #id.
Fancyoung
@Fancyoung Tak, masz rację, popełniłem błąd, location.hrefktóry pasuje do wyniku zamiastlocation.search .Dziękuję.
Ayano,
11

Korzystam z biblioteki parseUri . Pozwala robić dokładnie to, o co prosisz:

var uri = 'www.test.com/t.html&a=1&b=3&c=m2-m3-m4-m5';
var c = uri.queryKey['c'];
// c = 'm2-m3-m4-m5'
Chris Dutrow
źródło
9

Oto moje rozwiązanie. Jak sugeruje Andy E., odpowiadając na to pytanie , nie jest dobre dla wydajności skryptu, jeśli wielokrotnie buduje różne ciągi regularne, uruchamia pętle itp. Tylko po to, aby uzyskać pojedynczą wartość. Tak więc opracowałem prostszy skrypt, który zwraca wszystkie parametry GET w jednym obiekcie. Powinieneś wywołać go tylko raz, przypisać wynik do zmiennej, a następnie w dowolnym momencie w przyszłości uzyskać dowolną wartość z tej zmiennej za pomocą odpowiedniego klucza. Zauważ, że zajmuje się także dekodowaniem URI (tj.% 20) i zastępuje + spacją:

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

Oto kilka testów skryptu, które można zobaczyć:

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

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

// For a query params with URI encoding...
var someParams = getUrlQueryParams("www.example.com/t.html?phrase=a%20long%20shot&location=Silicon+Valley%2C+USA");
alert(someParams["phrase"]); // Gives "a long shot".
alert(someParams["location"]); // Gives "Silicon Valley, USA".
Folusho Oladipo
źródło
.replace („+”, „”) zastąpi tylko pierwsze wystąpienie. Musisz użyć .replace (/ \ + / g, „”);
Tony
8

Lub jeśli nie chcesz wymyślać koła analizującego URI, użyj URI.js

Aby uzyskać wartość parametru o nazwie foo:

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

To co to robi

  1. Konwertuj document.location na ciąg znaków (jest to obiekt)
  2. Podaj ten ciąg do konstruktora klasy URI.js URI
  3. Wywołaj funkcję search (), aby uzyskać część adresu URL dotyczącą wyszukiwania (zapytania)
    (przekazanie wartości true powoduje, że obiekt wypisuje obiekt)
  4. Uzyskaj dostęp do właściwości foo na wynikowym obiekcie, aby uzyskać wartość

Oto skrzypce do tego .... http://jsfiddle.net/m6tett01/12/

Gus
źródło
8

W przypadku wartości parametru pojedynczego, takiego jak index.html? Msg = 1 użyj następującego kodu,

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

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

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

}

Dla wartości wszystkich parametrów należy stosować następujący kod,

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

function queryString()
{
    var queryString = window.location.search;
    var varArray = queryString.split("&");
    for (var i=0;i<varArray.length;i++) {
      var param = varArray[i].split("=");
        //parameter-value pair
    }
} 
Ravi Patel
źródło
1
Podoba mi się to rozwiązanie!
alemur
8

Tutaj zamieszczam jeden przykład. Ale jest w jQuery. Mam nadzieję, że pomoże innym:

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

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

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')          // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')   // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});
</script>
Sariban D'Cl
źródło
1
Skopiowano z drugiego postu: „Wymaga wtyczki url: plugins.jquery.com/url”
zeta
8

Najkrótsza droga:

new URL(location.href).searchParams.get("my_key");
Strefa
źródło
2
Wolałbym używać new URL(location.href).searchParams.get("my_key")ponad, URLSearchParamsponieważ to drugie zakończy się niepowodzeniem podczas pobierania pierwszego parametru zapytania z dowolnego adresu URL.
Travis Clarke
1
Przetestowano oba warianty. Zgadzam się z Tobą. Edytowałem odpowiedź.
Strefa
7

to pytanie ma zbyt wiele odpowiedzi, więc dodaję kolejne.

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

stosowanie:

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

radzi sobie to z pustymi parametrami (te klucze są obecne bez "=value"), ujawnieniem zarówno API skalarnego, jak i opartego na tablicach API pobierania wartości, a także prawidłowym dekodowaniem komponentu URI.

Tyson
źródło
7

Najłatwiejszy sposób przy użyciu replace()metody:

Z urlStrciągu:

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

lub z bieżącego adresu URL :

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

Wyjaśnienie:

  • document.URL - interfejs zwraca lokalizację dokumentu (URL strony) jako ciąg znaków.
  • replace() - metoda zwraca nowy ciąg z niektórymi lub wszystkimi dopasowaniami a wzorca zastąpionymi zamiennikiem .
  • /.*param_name=([^&]*).*/- wzorzec wyrażenia regularnego zamknięty między ukośnikami, co oznacza:
    • .* - zero lub więcej dowolnych znaków,
    • param_name= - nazwa param, która jest wyryta,
    • () - grupa w wyrażeniu regularnym,
    • [^&]* - jedna lub więcej dowolnych postaci z wyłączeniem & ,
    • | - przemienność,
    • $1 - odniesienie do pierwszej grupy w wyrażeniu regularnym.

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

simhumileco
źródło
1
Dobre rozwiązanie, ale jeśli parametr nie zostanie znaleziony, zwracany jest cały ciąg. Oczekiwałbym w tym przypadku „niezdefiniowany”.
pensan
1
Cześć @pensan, dziękuję za wspaniały komentarz. Dodaję do wyrażenia regularnego obsługę sytuacji, gdy parametr nie pojawia się w adresie URL. W tym przypadku otrzymujemy ciąg emty (nie cały ciąg).
simhumileco
6

Jeszcze jedna sugestia.

Istnieją już dobre odpowiedzi, ale uznałem je za niepotrzebnie złożone i trudne do zrozumienia. Jest krótki, prosty i zwraca prostą tablicę asocjacyjną z nazwami kluczy odpowiadającymi nazwom tokenów w adresie URL.

Dodałem wersję z komentarzami poniżej dla tych, którzy chcą się uczyć.

Zauważ, że opiera się na jQuery ($ .each) dla swojej pętli, którą polecam zamiast forEach. Uważam, że łatwiej jest zapewnić kompatybilność z różnymi przeglądarkami, używając jQuery w całym systemie, niż podłączać poszczególne poprawki w celu obsługi tych nowych funkcji, które nie są obsługiwane w starszych przeglądarkach.

Edycja: Po tym, jak to napisałem, zauważyłem odpowiedź Erica Elliotta, która jest prawie taka sama, chociaż używa ona dlaEach, podczas gdy ogólnie jestem przeciwny (z powodów wymienionych powyżej).

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

Skomentowana wersja:

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

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

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

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

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

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

    return tokens;  // return the array
}

W poniższych przykładach przyjmiemy ten adres:

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

Możesz przypisać tokeny URL do własnej zmiennej:

var tokens = getTokens();

Następnie odwołaj się do każdego tokena URL według nazwy w następujący sposób:

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

Spowoduje to wydrukowanie „4”.

Możesz również po prostu odwołać się bezpośrednio do nazwy tokena z funkcji:

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

... który wydrukowałby „murray”.

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

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

Dostał się stąd: http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-w--quest.html

thezar
źródło
6

Prosta droga

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

następnie nazwij to jak getParams (url)

Sudhakar Reddy
źródło
5

Musiałem przeczytać zmienną URL GET i wykonać akcję na podstawie parametru url. Szukałem wysokiego i niskiego rozwiązania w celu znalezienia rozwiązania. Zasadniczo odczytuje bieżący adres strony, wykonuje wyrażenie regularne na adresie URL, a następnie zapisuje parametry adresu URL w tablicy asocjacyjnej, do której mamy łatwy dostęp.

Jako przykład, gdybyśmy mieli następujący adres URL z javascript u dołu na miejscu.

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

Wszystko, co musimy zrobić, aby uzyskać parametry id i stronę, to wywołać to:

Kod będzie:

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

alert(first);
alert(second);
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>
Waseem Khan
źródło
Przepracowałem dla mnie dzięki
OJB1
5
// http:localhost:8080/path?param_1=a&param_2=b
var getParamsMap = function () {
    var params = window.location.search.split("&");
    var paramsMap = {};
    params.forEach(function (p) {
        var v = p.split("=");
        paramsMap[v[0]]=decodeURIComponent(v[1]);
    });
    return paramsMap;
};

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

console.log(getParamsMap()["param_1"]);  // should log "a"     
Wolf7176
źródło
Zwraca pierwszy parametr z „?”
Pini Cheyni
5

Ten Gist autorstwa Eldona McGuinnessa jest zdecydowanie najbardziej kompletną implementacją parsera ciągów zapytań JavaScript, jaki do tej pory widziałem.

Niestety jest napisany jako wtyczka jQuery.

Przepisałem go na waniliowy JS i wprowadziłem kilka ulepszeń:

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

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

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

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

Zobacz także to skrzypce .

John Slegers
źródło
To, czego nie rozumiem w javascript, to dlaczego nie stworzyli i nie umieścili funkcji parsowania adresów URL w samym języku lub przynajmniej w bibliotece standardów? rzeczy niskiego poziomu nie należy tego ciągle wymyślać na nowo, ani nie pozostawiać programistom korzystania z dowolnych, entropicznie wariantowych rozwiązań, które wymyślą. Jeśli jest to solidne, coś takiego powinno zostać wprowadzone do standardowej biblioteki. To jest przykład tego rodzaju rzeczy w javascript, który zniechęca mnie do języka.
ahnbizcad
5

Eleganckie, funkcjonalne rozwiązanie

Utwórzmy obiekt zawierający nazwy parametrów URL jako klucze, a następnie możemy łatwo wyodrębnić parametr po jego nazwie:

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

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

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


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

źródło
uwielbiam to, ale nie zadziałało dla mnie bez zwracania akumulatora w funkcji redukcji
Ella
@Ella to była literówka, nie ma mowy, żeby mogła działać bezreturn
Teraz wygląda lepiej, miejmy nadzieję, że dotrzesz na pierwszą stronę!
Ella,
4

Oto co robię:

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


// background functions:

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

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

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}
Bobb Fwed
źródło