Pytanie Jak uzyskać wartości ciągów zapytania w JavaScript?


Czy istnieje sposób bez pobierania wtyczki? ciąg zapytania wartości przez jQuery (lub bez)?

Jeśli tak to jak? Jeśli nie, czy istnieje wtyczka, która może to zrobić?


2703


pochodzenie


Używam wtyczki getUrlParam opisane w jQuery-Plugin - getUrlParam (wersja 2). - coma
ZA zwykły javascript rozwiązanie bez RegEx: css-tricks.com/snippets/javascript/get-url-variables - Lorenzo Polidori
Chociaż najlepsze rozwiązanie tego pytania zasługuje na swoją popularność ze względu na doskonałą obserwację, że jQuery nie jest potrzebny, jego metoda tworzenia nowych wyrażeń regularnych i ponownego analizowania ciągu zapytania dla każdego pożądanego parametru jest niezwykle nieefektywna. O wiele skuteczniejsze (i wszechstronne) rozwiązania istnieją od dawna, na przykład w tym artykule przedrukowano tutaj: htmlgoodies.com/beyond/javascript/article.php/11877_3755006_3/... - Joseph Myers
możliwy duplikat Ciąg zapytania JavaScript
Joseph, "doskonała obserwacja, że ​​jQuery nie jest potrzebna"? Oczywiście, że nie jest potrzebna. Wszystko, co robi jQuery, używa JavaScript. Ludzie nie używają jQuery, ponieważ robi to, czego JavaScript nie może zrobić. Celem jQuery jest wygoda. - Vladimir Kornea


Odpowiedzi:


Do tego celu nie potrzebujesz jQuery. Możesz użyć tylko trochę 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, ' '));
}

Stosowanie:

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


Uwaga: Jeśli parametr występuje kilka razy (?foo=lorem&foo=ipsum), otrzymasz pierwszą wartość (lorem). Nie ma w tym standardu, a użycie różni się, patrz na przykład to pytanie: Stanowisko autorytatywne duplikatów kluczy zapytań HTTP GET.
UWAGA: W funkcji rozróżniana jest wielkość liter. Jeśli wolisz nazwę parametru niewrażliwą na wielkość liter, dodaj modyfikator "i" do RegExp


To jest aktualizacja oparta na nowym Specyfikacja URLSearchParams aby osiągnąć ten sam wynik w bardziej zwięzły sposób. Zobacz odpowiedź pod tytułem "URLSearchParams"poniżej.


7025



Nikt nie mówi, że nie da się tego zrobić przy pomocy czystego JavaScriptu. Jeśli już używasz jQuery, a jQuery ma do tego funkcję, to sensownym byłoby użycie jQuery zamiast ponownego wymyślania koła z nową funkcją. - Cerin
Jak działa ta funkcja http://www.mysite.com/index.php?x=x1&x=x2&x=x3 Wartość pola x jest dwuznaczny. - dpp
to też nie radzi sobie klucze wielowartościowe, które są również całkowicie legalne. - hurrymaplelad
Dlaczego używałbyś do tego wyrażenia regularnego? - Ry-♦
Dla zapytania o ?mykey=0&m.+key=1, dzwonienie getParameterByName("m.+key") wróci 0 zamiast 1. Musisz uciec metaznaki z wyrażeniem regularnym w name przed budowaniem twojego regularnego wyrażenia. I musisz tylko zadzwonić .replace() raz za pomocą flagi globalnej i za pomocą "\\$&" jako wyrażenie zastępcze. Powinieneś szukać location.search zamiast location.href. Odpowiedź zawierająca ponad 400 zapisków powinna uwzględniać te szczegóły. - gilly3


Niektóre z zamieszczonych tu rozwiązań są nieefektywne. Powtarzanie wyszukiwania wyrażenia regularnego za każdym razem, gdy skrypt potrzebuje dostępu do parametru, jest zupełnie niepotrzebne, wystarczy jedna funkcja do podziału parametrów na obiekt typu tablica asocjacyjna. Jeśli nie współpracujesz z interfejsem API historii HTML 5, jest to konieczne tylko raz podczas wczytywania strony. Inne sugestie również nie potrafią poprawnie odczytać 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.Lokalizacja.search.podłańcuch(1);

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

Przykładowy ciąg znaków zapytania:

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

Wynik:

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

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

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

Można to łatwo poprawić w celu obsługi łańcuchów zapytań w stylu tablicowym. Przykładem tego jest tutaj, ale ponieważ parametry w stylu tablicy nie są zdefiniowane w RFC 3986 Nie będę zanieczyszczał tej odpowiedzi kodem źródłowym. Dla zainteresowanych wersją "zanieczyszczoną" spójrz na odpowiedź Campbeln poniżej.

Ponadto, jak wskazano w komentarzach, ; jest prawnym ogranicznikiem dla key=value pary. Wymagałoby to obsługi bardziej skomplikowanego wyrażenia regularnego ; lub &, co moim zdaniem jest niepotrzebne, ponieważ jest to rzadkie ; jest używany i powiedziałbym jeszcze bardziej nieprawdopodobnie, że oba zostaną użyte. Jeśli potrzebujesz wsparcia ; zamiast &, po prostu zamień je w regex.


  Jeśli używasz języka preprocesingu po stronie serwera, możesz użyć jego macierzystych funkcji JSON, aby wykonać ciężki lifting dla ciebie. Na przykład w PHP możesz napisać:

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

O wiele prostsze!


1627



jeśli robisz ciężką aplikację ajax'ową, możesz użyć skrótu (#) do "włączenia przycisku wstecz" ... w takim przypadku ciąg znaków zapytania zmieniałby się cały czas (zobacz, jak robi to Facebook). .. chociaż te rozwiązania ignorują rzeczy, które pojawiają się po # anway ... - Nick Franceschina
@Nick: Cokolwiek po haszowaniu znajduje się w window.location.hash własność, która jest oddzielna od window.location.search własność. Jeśli zmiana hash zostanie zmieniona, nie wpłynie to w ogóle na kwerendę. - Andy E
Nie zapomnij o ; jest ogranicznik prawny dla GET key=value pary. Jest to rzadkie, ale wdrożenie zajmuje 5 sekund. - alex
Aby być uczciwym, żaden konkretny format ciągu zapytania nie jest zdefiniowany przez RFC3986. ?a=b&c=d jest konwencjonalny i zalecenie W3C dla formularzy internetowych, ale specyfikacja URI właśnie definiuje query = *( pchar / "/" / "?" ). - Matthew Gilliard
Dla tych z nas, którzy używają dość ścisłej konfiguracji JSHint zamieniają while(match = search.exec(query)) z while((match = search.exec(query)) !== null) - craigts


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

Z adresem URL podobnym ?topic=123&name=query+string, powróci:

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

Metoda Google

Przeszukując kod Google znalazłem metodę, której używają: 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
}

Jest zaciemniony, ale jest zrozumiały.

Zaczynają szukać parametrów z adresu URL z ? a także z hasha #. Następnie dla każdego parametru dzielą się w znaku równości b[f][p]("=") (który wygląda jak indexOf, używają pozycji znaku, aby uzyskać klucz / wartość). Po podzieleniu sprawdzają, czy parametr ma wartość, czy też nie, jeśli następnie przechowuje wartość d, w przeciwnym razie po prostu kontynuują.

W końcu obiekt d jest zwracany, obsługa ucieczki i + znak. Ten obiekt jest taki jak mój, ma to samo zachowanie.


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

Stosowanie

//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 wydajności (metoda dzielona na metodę regex) (jsPerf)

Kod przygotowania: deklaracja metod

Podziel test kodu

var qs = window.GetQueryString(query);

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

Kod testowy Regex

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

Testowanie w Firefoksie 4.0 x86 na Windows Server 2008 R2 / 7 x64

  • Metoda podziału: 144,780 ± 2,17% najszybciej
  • Metoda Regex: 13 891 ± 0,85% | 90% wolniej

1193



Jest to również przyjemne podejście, dzielenie ciągów znaków zamiast używania wyrażeń regularnych. Warto jednak zwrócić uwagę na kilka rzeczy :-) 1. unescape jest przestarzałą funkcją i jest zamieniana na decodeURIComponent(), zauważ, że żadna z tych funkcji poprawnie nie rozszyfruje a + do postaci spacji. 2. Należy zadeklarować wynik jako obiekt, a nie tablicę, ponieważ JavaScript nie ma tablic asocjacyjnych, jako takich, a zadeklarowana tablica jest traktowana jako obiekt, przypisując do niej nazwane właściwości. - Andy E
Ciekawe, dlaczego zrobiłbyś tę wtyczkę jQuery, gdy nie ma ona żadnego specyficznego kodu jQuery? - zachleat
@zachleat, jeśli nie masz frameworka, twoje funkcje zostaną po prostu rozproszone po całym kodzie. Jeśli rozszerzysz jQuery, będziesz mieć możliwość korzystania z twoich funkcji, nie będzie on się gdzieś znajdował w twoim kodzie. Myślę, że to jedyny powód. - BrunoLM
Oto wersja jQuery poprawione, aby przejść JSLint (co najmniej pół-ruchomy cel JSLint.com w dniu 2011-06-15). Głównie po prostu poruszające rzeczy, aby uspokoić The Crockford. - patridge
Jak żartował @BenjaminGruenbaum, również nie bardzo widzę sens w porównywaniu wydajności parsowania adresów URL. Jeśli został przekształcony w izomorficzny moduł JavaScript, który mógłby zostać wywołany z Węzła na, powiedzmy, analizować dzienniki, a następnie tak. Ale używając go do wyodrębnienia parametrów adresu URL z window.location sprawia, że ​​wszelkie problemy związane z wydajnością są sporne, biorąc pod uwagę, że klient poruszający się po adresie URL jest znacznie droższy. - Dan Dascalescu


Ulepszona wersja Odpowiedź Artema Bargera:

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

Aby uzyskać więcej informacji na temat poprawy, zobacz: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/


636



Jeśli chcesz go nieco skrócić, możesz znieść warunek trójskładnikowy i zastąpić go odrobiną zwarcia na ostatniej linii - return match && decodeURIComponent(match[1].replace(/\+/g, ' '));. - Andy E
Powraca null jeśli po parametrze nie następuje "=". Możesz wstać if (!RegExp('[?&]'+name+'(&.*)?$').exec(window.location.search)) return false; aby wrócić boolean false jeśli parametr w ogóle nie istnieje. - commonpike
Chciałbym użyć new prefiks podczas tworzenia wyrażenia regularnego: var match = new RegExp('... - Patrick Berkeley
Błąd IE11: IE decyduje się na przedawkowanie zwracanej wartości znakiem ASCII 8206 (hex: 200E - znak "od lewej do prawej"). Zmarnowałem ponad 6 godzin, znajdując to! lecznicze odpowietrzanie .... naprawić, dodać do końca ostatniej linii: .replace('\u200E', '') - JayRO-GreyBeard
W chrome na Macu przynajmniej (może również w innych przeglądarkach) ostatnia wartość otrzymywała "/". Więc zmodyfikowałem wyrażenie regularne, aby je zignorować. var results = new RegExp('[\\?&]' + name + '=([^&#/]*)').exec(url); - CaseyB


URLSearchParams

Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ i Chrome 49+ obsługują URLSearchParams API:

Jest sugerowany przez Google URLSearchParams polyfill dla stabilnych wersji IE.

Nie jest standaryzowany przez W3C, ale jest to standard życia według WhatWG.

Możesz użyć go na miejscu, ale musisz usunąć ? znak zapytania (na przykład z .slice(1)):

let params = new URLSearchParams(location.search.slice(1));

lub

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

Lub oczywiście pod dowolnym adresem URL:

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

Można uzyskać params również za pomocą skrótu .searchParams właściwość w obiekcie URL, na przykład:

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

Czytasz / ustawiasz parametry przez get(KEY), set(KEY, VALUE), append(KEY, VALUE) API. Możesz także iterować po wszystkich wartościach for (let p of params) {}.

ZA implementacja referencyjna i a Przykładowa Strona są dostępne do audytu i testowania.


482



IE wciąż brakuje ... nie, że go używam :( - mlt
Ci dwaj dubliwiści prawdopodobnie przegapili (tak jak ja właśnie) fakt, że musisz użyć .get zamiast po prostu . - Nakilon
Tak naprawdę nie musisz slice(1) na .search, możesz go użyć bezpośrednio. URLSearchParams poradzi sobie z prowadzeniem ?. - Jason C
Proszę głosować dla tego pluskwa aby naprawić. Dzięki temu zespół Edge będzie wiedział, że jest zainteresowanie! - styfle
Najlepsza odpowiedź. W końcu ktoś zapewnił natywne podejście. Dzięki - Green


Kolejna rekomendacja. Wtyczka Bełkot pozwala odzyskać wszystkie części adresu URL, w tym kotwicę, host itd.

Może być używany z jQuery lub bez niego.

Użycie jest bardzo proste i fajne:

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'

Jednak od 11 listopada 2014 r. Purl nie jest już obsługiwany i autor zaleca używanie URI.js zamiast. Wtyczka jQuery różni się tym, że skupia się na elementach - do użycia z ciągami, po prostu użyj URI bezpośrednio, z lub bez jQuery. Podobny kod wyglądałby tak, pełniejsze dokumenty tutaj:

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'

394



Od chwili pisania pisma nie jest już dłużej utrzymywany, a poprzedni opiekun sugeruje uri.js - Dan Pantry


tl; dr

Szybki, kompletne rozwiązanie, który obsługuje klucze wielowartościowe i zakodowane znaki.

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)})
Wielowierszowe:
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 to jest cały ten kod ...
"koalescencja zerowa", ocena zwarcia
ES6 Zadanie restrukturyzacyjne, Funkcje strzałek, Ciągi szablonów

Przykład:
"?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"



Przeczytaj więcej ... o rozwiązaniu Vanilla JavaScript.

Aby uzyskać dostęp do różnych części adresu URL location.(search|hash)

Najprostsze (pozorne) rozwiązanie

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
  • Uchwyty puste klucze prawidłowo.
  • Zastępuje multi-klucze z ostatni, ubiegły, zeszły znaleziono wartość.
"?a=1&b=0&c=3&d&e&a=5"
> queryDict
a: "5"
b: "0"
c: "3"
d: undefined
e: undefined

Klucze wielowartościowe

Proste sprawdzanie klucza (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]]})
  • Teraz wraca tablice zamiast.
  • Uzyskaj wartości przez qd.key[index] lub qd[key][index]
> qd
a: ["1", "5"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined]

Zakodowane znaki?

Posługiwać się decodeURIComponent() na sekundę lub oba dzieli się.

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]})
Przykład:
"?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 komentarzy

* !!! Proszę to zanotować decodeURIComponent(undefined) zwraca ciąg "undefined". Rozwiązanie polega na prostym użyciu &&, który to gwarantuje decodeURIComponent() nie jest wywoływana na niezdefiniowanych wartościach. (Zobacz "pełne rozwiązanie" u góry).

v = v && decodeURIComponent(v);


Jeśli kwerenda jest pusta (location.search == ""), wynik jest nieco mylący qd == {"": undefined}. Zaleca się sprawdzenie kwerendy przed uruchomieniem funkcji parsowania likeso:

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

217



Miły. Jedyną rzeczą, którą chciałbym zmienić - jest to, że jeśli nie ma więcej niż jednej wartości dla klucza, nie ma potrzeby, aby była to tablica. Używaj tylko tablicy, jeśli istnieje więcej niż jedna wartość na klucz. - Pavel Nikolov
@PavelNikolov Myślę, że wprowadziłoby to trudności w uzyskiwaniu czasami tablicy, a czasem wartości. Najpierw musicie to sprawdzić, teraz sprawdzacie tylko długość, ponieważ i tak będziecie używać cykli do pobierania tych wartości. Miało to być również tutaj najprostsze, ale funkcjonalne rozwiązanie. - Qwerty
@twig nie działa w IE8 - sqram
Spłaszczony nieco dla czytelności, przekształcony w funkcję i ponownie użyty split call: function parseQueryString () {var qd = {}; location.search.substr (1) .split ("&"). forEach (funkcja (element) {var parts = item.split ("="); var k = parts [0]; var v = decodeURIComponent (parts [ 1]); (k in qd)? Qd [k] .push (v): qd [k] = [v,]}); return qd; } - Casey
decodeDocumentURI (undefined) zwraca "undefined" zamiast undefined. Funkcjonalna, ale niezbyt elegancka łatka: var qd = {}; location.search.substr(1).split("&").forEach( function(item) { var s = item.split("="), k = s[0], v; if(s.length>1) v = decodeURIComponent(s[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v] }) - loop


Roshambo na snipplr.com ma prosty skrypt do osiągnięcia tego opisanego w Uzyskaj parametry adresu URL za pomocą jQuery | Ulepszony. Dzięki jego skryptowi łatwo można uzyskać tylko pożądane parametry.

Oto sedno:

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

Następnie po prostu pobierz parametry z ciągu zapytania.

Więc jeśli adres URL / ciąg zapytania był xyz.com/index.html?lang=de.

Zadzwoń var langval = $.urlParam('lang');i masz to.

UZBEKJON ma też świetny post na blogu, Uzyskaj parametry i wartości adresów URL za pomocą jQuery.


215



z jQuery wydaje się oznaczać, że przestrzeń nazw pełni funkcję obiektu jQuery. Ponadto, dlaczego jest niepoprawna wartość 0? Oczywiście, mógłbym użyć ścisłej kontroli równości, ale nie powinienem null ? - alex
Zgoda. Działa tak samo, jak normalna odwołanie do zmiennej javascript w ten sposób (z wyjątkiem tego, że zwracanie niezdefiniowanych byłoby bardziej dokładne). - Isochronous
Nazwa "name" nie jest właściwie uciekła, jest po prostu bezpośrednio wprowadzana do RegExp. To się nie udaje. Jak powiedzieli inni, jest to niewiarygodne, że te odpowiedzi wymyślają nowe koło i zdobywają tak wiele głosów, kiedy to powinno zostać zaimplementowane w dobrze przetestowanej bibliotece. - Triynko