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?
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?
Odpowiedzi:
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ć
URL
obiektu (który jest częścią interfejsów API udostępnianych przez przeglądarki JS):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:
Możesz pobrać ciąg zapytania z adresu URL bieżącej strony za pomocą:
źródło
URL
oprócz tego dlaURLSearchParams
. Możesz też uniknąć tego problemu, zastępując wierszvar c = url.searchParams.get("c");
w powyższej odpowiedzi słowemvar c = new URLSearchParams(window.location.search).get("c");
.new URL()
oczekuje, że otrzyma poprawnie zakodowany adres URL jako argument.decodeURIComponent
oczekuje, że zostanie przekazany składnik adresu URL, a nie cały adres URL.decodeURIComponent
nie należy stosować w tym przypadkuparse_query_string
Funkcja robi podwójnego dekodowaniavalue
.=
Wydane wymienić @ManelClos można rozwiązać przez dodanie drugiego parametru2
(limit
) dovars[i].split()
.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:
źródło
qs.split('+').join(' ');
nieqs.replace(/\+/g, ' ');
?źródło
źródło
Jest to prosty sposób na sprawdzenie tylko jednego parametru:
Przykładowy adres URL:
Przykładowy Javascript:
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:
Aktualizacja: Działa to lepiej:
I działa poprawnie, nawet jeśli adres URL jest pełen parametrów.
źródło
http://myserver/action?myParam=2&anotherParam=3
dałby nie,"2"
ale"2&anotherParam=3"
.(location.search.split('myParam=')[1]||'').split('&')[0]
- do użycia z wieloma parametrami lub ewentualnie brakującymimyParam
.location.search.split('myParam=').splice(1).join('').split('&')[0]
[?|&]
jak w[?|&]myParam=([^&]+)
result = decodeURIComponent(result);
Dostawcy przeglądarek zaimplementowali natywny sposób, aby to zrobić za pomocą URL i URLSearchParams.
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.
źródło
new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')
wracanull
? (W stabilnym Chrome).b
ic
wydaje się, że działa dobrze.url.searchParams
zamiast tegonew URLSearchParams(url.search)
.Znalazłem to wieki temu, bardzo łatwe:
Następnie nazwij to tak:
źródło
decodeURIComponent()
na wartości, ponieważ z tym zwykle chcesz pracować; użyjwindow.location.search
zamiastwindow.location.href
, ponieważ interesują Cię tylko parametry, a nie cały adres URL.var vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Możesz pobrać ciąg zapytania
location.search
, a następnie możesz podzielić wszystko po znaku zapytania:źródło
?array[]=1&array[]=2
Produkuje{"array[]": "2"}
, co jest wyraźnie błędne.[]
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ć.Napisałem prostsze i eleganckie rozwiązanie.
źródło
[0-9]
na\d
Bardzo prosty sposób za pomocą URLSearchParams .
Jest obecnie obsługiwany w Chrome, Firefox, Safari, Edge i innych .
źródło
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ż:
Kod:
źródło
Stworzyłem funkcję, która to robi:
Aktualizacja 26.05.2017, oto implementacja ES7 (działa ze wstępnie ustawionymi etapami 0, 1, 2 lub 3 w Babel):
Niektóre testy:
Aktualizacja 26.03.2018, oto implementacja maszynopisu:
Aktualizacja 13.02.2019, oto zaktualizowana implementacja TypeScript, która współpracuje z TypeScript 3.
źródło
Object {"": ""}
Zobacz
źródło
Rozwiązanie ECMAScript 6:
źródło
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())
}używam
źródło
window.location.search
nie będzie zawierać skrótu#id
.location.href
który pasuje do wyniku zamiastlocation.search
.Dziękuję.Korzystam z biblioteki parseUri . Pozwala robić dokładnie to, o co prosisz:
źródło
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ą:
Oto kilka testów skryptu, które można zobaczyć:
źródło
Lub jeśli nie chcesz wymyślać koła analizującego URI, użyj URI.js
Aby uzyskać wartość parametru o nazwie foo:
To co to robi
(przekazanie wartości true powoduje, że obiekt wypisuje obiekt)
Oto skrzypce do tego .... http://jsfiddle.net/m6tett01/12/
źródło
W przypadku wartości parametru pojedynczego, takiego jak index.html? Msg = 1 użyj następującego kodu,
Dla wartości wszystkich parametrów należy stosować następujący kod,
źródło
Tutaj zamieszczam jeden przykład. Ale jest w jQuery. Mam nadzieję, że pomoże innym:
źródło
Najkrótsza droga:
źródło
new URL(location.href).searchParams.get("my_key")
ponad,URLSearchParams
ponieważ to drugie zakończy się niepowodzeniem podczas pobierania pierwszego parametru zapytania z dowolnego adresu URL.to pytanie ma zbyt wiele odpowiedzi, więc dodaję kolejne.
stosowanie:
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.źródło
Najłatwiejszy sposób przy użyciu
replace()
metody:Z
urlStr
ciągu:lub z bieżącego adresu URL :
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.źródło
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).
Skomentowana wersja:
W poniższych przykładach przyjmiemy ten adres:
Możesz przypisać tokeny URL do własnej zmiennej:
Następnie odwołaj się do każdego tokena URL według nazwy w następujący sposób:
Spowoduje to wydrukowanie „4”.
Możesz również po prostu odwołać się bezpośrednio do nazwy tokena z funkcji:
... który wydrukowałby „murray”.
źródło
Dostał się stąd: http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-w--quest.html
źródło
Prosta droga
następnie nazwij to jak getParams (url)
źródło
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.
Wszystko, co musimy zrobić, aby uzyskać parametry id i stronę, to wywołać to:
Kod będzie:
źródło
źródło
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ń:
Zobacz także to skrzypce .
źródło
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:
źródło
return
Oto co robię:
źródło