Czy istnieje sposób bez wtyczek do pobierania wartości ciągu zapytania za pomocą jQuery (lub bez)?
Jeśli tak to jak? Jeśli nie, czy istnieje wtyczka, która może to zrobić?
javascript
url
plugins
query-string
Ripounet
źródło
źródło
Odpowiedzi:
Aktualizacja: wrzesień 2018 r
Możesz użyć URLSearchParams, który jest prosty i ma przyzwoitą (ale nie pełną) obsługę przeglądarki .
Oryginalny
W tym celu nie potrzebujesz jQuery. Możesz użyć tylko czystego JavaScript:
Stosowanie:
Uwaga: Jeśli parametr występuje kilka razy (
?foo=lorem&foo=ipsum
), otrzymasz pierwszą wartość (lorem
). Nie ma w tym standardu, a zastosowania różnią się, patrz na przykład pytanie: Autorytatywna pozycja duplikatów kluczy zapytań HTTP GET .UWAGA: W funkcji rozróżniana jest wielkość liter. Jeśli wolisz nazwę parametru bez rozróżniania wielkości liter, dodaj modyfikator „i” do RegExp
Jest to aktualizacja oparta na nowych specyfikacjach URLSearchParams, aby bardziej zwięźle osiągnąć ten sam wynik. Zobacz odpowiedź zatytułowaną „ URLSearchParams ” poniżej.
źródło
http://www.mysite.com/index.php?x=x1&x=x2&x=x3
Wartość polax
jest niejednoznaczna.?mykey=0&m.+key=1
wywołaniegetParameterByName("m.+key")
wróciłoby0
zamiast1
.name
Przed budowaniem wyrażenia regularnego musisz uciec przed metaznakami wyrażeń regularnych. Wystarczy zadzwonić.replace()
tylko raz, używając flagi globalnej i używając"\\$&"
wyrażenia zastępującego. Powinieneś szukaćlocation.search
zamiastlocation.href
. Odpowiedź zawierająca ponad 400 głosów pozytywnych powinna uwzględniać te szczegóły.Niektóre zamieszczone tutaj rozwiązania są nieefektywne. Powtarzanie wyszukiwania wyrażeń regularnych za każdym razem, gdy skrypt musi uzyskać dostęp do parametru, jest całkowicie niepotrzebne, wystarczy jedna funkcja do podzielenia parametrów na obiekt w stylu tablicy asocjacyjnej. Jeśli nie pracujesz z interfejsem API historii HTML 5, jest to konieczne tylko raz na ładowanie strony. Inne sugestie również nie mogą poprawnie odkodować adresu URL.
Przykład kwerendy:
Wynik:
Można to łatwo poprawić, aby obsługiwać również ciągi zapytań w stylu tablicowym. Przykładem tego jest tutaj , ale ponieważ parametry stylu tablicowego nie są zdefiniowane w RFC 3986, nie będę zanieczyszczać tej odpowiedzi kodem źródłowym. Dla osób zainteresowanych wersją „zanieczyszczoną” zapoznaj się z odpowiedzią Campbeln poniżej .
Ponadto, jak wskazano w komentarzach,
;
jest prawnym ogranicznikiem dlakey=value
par. Wymagałoby to bardziej skomplikowanego wyrażenia regularnego do obsługi;
lub&
, co moim zdaniem jest niepotrzebne, ponieważ;
jest używane rzadko, a powiedziałbym, że jeszcze bardziej mało prawdopodobne, aby oba były używane. Jeśli potrzebujesz wsparcia;
zamiast&
, po prostu zamień je w wyrażeniu regularnym.Jeśli używasz języka wstępnego przetwarzania po stronie serwera, możesz skorzystać z jego natywnych funkcji JSON, aby wykonać dla ciebie ciężkie podnoszenie. Na przykład w PHP możesz napisać:
O wiele prostsze!
AKTUALIZACJA
Oto podejście do zarządzania:
źródło
window.location.hash
właściwości, która jest oddzielna odwindow.location.search
właściwości. Jeśli skrót zostanie zmieniony, nie wpłynie to w żaden sposób na kwerendę.;
jest to prawny ogranicznik dlakey=value
par GET . Jest to rzadkie, ale wdrożenie zajmuje 5 sekund.?a=b&c=d
jest konwencjonalny i jest zaleceniem W3C dla formularzy internetowych, ale specyfikacja URI po prostu określaquery = *( pchar / "/" / "?" )
.while(match = search.exec(query))
zwhile((match = search.exec(query)) !== null)
ES2015 (ES6)
Bez jQuery
W przypadku adresu URL typu
?topic=123&name=query+string
zwrócony zostanie następujący:Metoda Google
Rozdzierając kod Google znalazłem metodę, której używają:
getUrlParameters
Jest zaciemniony, ale zrozumiały. To nie działa, ponieważ niektóre zmienne są niezdefiniowane.
Zaczynają szukać parametrów w adresie URL od,
?
a także od skrótu#
. Następnie dla każdego parametru dzielą się na znak równościb[f][p]("=")
(który wygląda na toindexOf
, że używają pozycji znaku, aby uzyskać klucz / wartość). Po podzieleniu sprawdzają, czy parametr ma wartość, czy nie, a jeśli tak, to przechowują wartośćd
, w przeciwnym razie po prostu kontynuują.Ostatecznie obiekt
d
jest zwracany, obsługuje ucieczkę i+
znak. Ten obiekt jest podobny do mojego, ma takie samo zachowanie.Moja metoda jako wtyczki jQuery
Stosowanie
Test wydajności (metoda podziału względem metody wyrażenia regularnego) ( jsPerf )
Kod przygotowania: deklaracja metod
Podziel kod testowy
Kod testu Regex
Testowanie w przeglądarce Firefox 4.0 x86 w systemie Windows Server 2008 R2 / 7 x64
źródło
unescape
jest przestarzałą funkcją i jest zastępowanadecodeURIComponent()
, należy pamiętać, że żadna z tych funkcji nie rozszyfruje poprawnie+
znaku spacji. 2. Powinieneś zadeklarować wynik jako obiekt, a nie tablicę, ponieważ JavaScript sam w sobie nie ma tablic asocjacyjnych, a deklarowana tablica jest traktowana jako obiekt poprzez przypisanie mu nazwanych właściwości.window.location
powoduje, że wszelkie problemy dotyczą wydajności, ponieważ klient nawigujący do adresu URL jest znacznie, znacznie droższy.Ulepszona wersja odpowiedzi Artem Barger :
Aby uzyskać więcej informacji na temat ulepszeń, patrz: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/
źródło
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
.null
jeśli po parametrze nie występuje „=”. Możeszif (!RegExp('[?&]'+name+'(&.*)?$').exec(window.location.search)) return false;
zrobić to, by zwrócił,boolean false
jeśli w ogóle nie ma parametru.new
tworzeniu wyrażenia regularnego użyłbym prefiksu:var match = new RegExp('...
.replace('\u200E', '')
var results = new RegExp('[\\?&]' + name + '=([^&#/]*)').exec(url);
URLSearchParams
Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ i Chrome 49+ obsługują interfejs API URLSearchParams :
Istnieje sugerowany przez Google polifill URLSearchParams dla stabilnych wersji IE.
Nie jest standaryzowany przez W3C , ale jest standardem życia WhatWG .
Możesz go użyć na
location
:lub
Lub oczywiście pod dowolnym adresem URL:
Parametry można również uzyskać, używając
.searchParams
właściwości skróconej obiektu URL, jak poniżej:Czytasz / ustawionych parametrów przez
get(KEY)
,set(KEY, VALUE)
,append(KEY, VALUE)
API. Możesz także iterować wszystkie wartościfor (let p of params) {}
.Implementacja referencyjna i strona próbki są dostępne do badania i testowania.
źródło
.get
zamiast po prostu.
slice(1)
włączać.search
, możesz go użyć bezpośrednio. URLSearchParams może obsługiwać wiodące?
.URLSearchParams
nie jest dobre, ponieważ nie zwraca rzeczywistych wartości parametrów adresu URL.new URL('https://example.com?foo=1&bar=2')
nie działa dla Androida URLfile:///android_asset/...
Kolejna rekomendacja. Wtyczka Purl umożliwia pobieranie wszystkich części adresu URL, w tym kotwicy, hosta itp.
Można go używać z jQuery lub bez niego.
Użycie jest bardzo proste i fajne:
Jednak od 11 listopada 2014 Purl nie jest już obsługiwany, a autor zaleca zamiast tego użycie URI.js. Wtyczka jQuery różni się tym, że koncentruje się na elementach - do użytku z ciągami, wystarczy użyć
URI
bezpośrednio, z lub bez jQuery. Podobny kod wyglądałby jako taki, pełniejsze dokumenty tutaj :źródło
tl; dr
Szybkie, kompletne rozwiązanie , które obsługuje klucze wielowartościowe i zakodowane znaki .
Wiele podszewek:Co to za cały ten kod ...
Przykład:„zerowanie koalescencyjne” , ocena zwarcia
ES6 Zadania destrukcyjne , funkcje strzałek , ciągi szablonów
Przeczytaj więcej ... o rozwiązaniu Vanilla JavaScript.
Aby uzyskać dostęp do różnych części adresu URL, użyj
location.(search|hash)
Najłatwiejsze (obojętne) rozwiązanie
Klucze wielowartościowe
Prosta kontrola klucza
(item in dict) ? dict.item.push(val) : dict.item = [val]
qd.key[index]
lubqd[key][index]
Zakodowane postacie?
Użyj
Przykład:decodeURIComponent()
do drugiego lub obu podziałów.Z komentarzy
* !!! Uwaga:
decodeURIComponent(undefined)
zwraca ciąg znaków"undefined"
. Rozwiązanie polega na prostym użyciu&&
, co zapewnia, żedecodeURIComponent()
nie zostaną wywołane niezdefiniowane wartości. (Zobacz „kompletne rozwiązanie” u góry).Jeśli kwerenda jest pusta (
location.search == ""
), wynik jest nieco mylącyqd == {"": undefined}
. Zaleca się sprawdzenie kwerendy przed uruchomieniem funkcji parsowania Like:źródło
array.forEach()
poprzez wstrzyknięcie określonego kodu na początku skryptu. patrz Polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…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] })
Roshambo na snipplr.com ma prosty skrypt, aby to osiągnąć, opisany w części Uzyskaj parametry adresu URL za pomocą jQuery | Poprawiła . Dzięki jego skryptowi możesz łatwo wyciągnąć tylko te parametry, które chcesz.
Oto sedno:
Następnie po prostu pobierz parametry z ciągu zapytania.
Więc jeśli ciąg adresu URL / zapytania był
xyz.com/index.html?lang=de
.Wystarczy zadzwonić
var langval = $.urlParam('lang');
, a masz to.UZBEKJON ma również świetny post na blogu, Uzyskaj parametry i wartości URL za pomocą jQuery .
źródło
0
? Jasne, mógłbym zastosować ścisłą kontrolę równości, ale czy nie powinno tak byćnull
?Jeśli używasz jQuery, możesz użyć biblioteki, takiej jak jQuery BBQ: Back Button & Query Library .
Edycja: dodawanie Deparam Przykład:
Jeśli chcesz po prostu używać zwykłego JavaScript, możesz użyć ...
Ze względu na nowy interfejs API historii HTML, a konkretnie
history.pushState()
ihistory.replaceState()
, adres URL może się zmienić, co spowoduje unieważnienie pamięci podręcznej parametrów i ich wartości.Ta wersja będzie aktualizować swoją wewnętrzną pamięć podręczną parametrów przy każdej zmianie historii.
źródło
Wystarczy użyć dwóch podziałów :
Czytałem wszystkie poprzednie i bardziej kompletne odpowiedzi. Ale myślę, że jest to najprostsza i szybsza metoda. Możesz sprawdzić ten test porównawczy jsPerf
Aby rozwiązać problem w komentarzu Rupa, dodaj podział warunkowy, zmieniając pierwszy wiersz na dwa poniżej. Ale absolutna dokładność oznacza, że jest teraz wolniejsza niż regexp (patrz jsPerf ).
Jeśli więc wiesz, że nie spotkasz się z przeciwną sprawą Rupa, wygrywa. W przeciwnym razie wyreżyseruj.
źródło
get('value')
Nahttp://the-url?oldvalue=1&value=2
.half
jest to prawda, to zwraca wartość null dla pustego parametru, takiego jak?param=
. W takim przypadku powinien zwrócić pusty ciąg znaków, a sprawdzenie tohalf !== undefined
rozwiązuje.function get(param){return decodeURIComponent((location.search.split(param+'=')[1]||'').split('&')[0])}
return half !== undefined ? decodeURIComponent(half[1].split('&')[0]) : null;
jąOto moje zadanie uczynienia z doskonałego rozwiązania Andy'ego E pełnoprawnej wtyczki jQuery:
Składnia jest następująca:
Najlepsze z obu światów!
źródło
Jeśli wykonujesz więcej manipulacji adresami URL niż po prostu analizując kwerendę, może być pomocne użycie pliku URI.js. Jest to biblioteka do manipulowania adresami URL - i zawiera wszystkie dzwonki i gwizdy. (Przepraszam za autoreklamę tutaj)
aby przekonwertować kwerendę na mapę:
(URI.js także „naprawia” złych querystrings podoba
?&foo&&bar=baz&
się?foo&bar=baz
)źródło
var data = URI.parseQuery('?foo=bar&bar=baz&foo=world');
dla tego samego wyniku ( dokumenty ).Podoba mi się rozwiązanie Ryana Phelana . Ale nie widzę sensu przedłużania jQuery? Nie ma zastosowania funkcji jQuery.
Z drugiej strony podoba mi się wbudowana funkcja w Google Chrome: window.location.getParameter.
Dlaczego więc tego nie użyć? Ok, inne przeglądarki nie mają. Utwórzmy więc tę funkcję, jeśli nie istnieje:
Ta funkcja jest mniej więcej od Ryana Phelana, ale jest opakowana inaczej: czysta nazwa i brak zależności od innych bibliotek javascript. Więcej o tej funkcji na moim blogu .
źródło
Oto szybki sposób na uzyskanie obiektu podobnego do tablicy $ _GET PHP :
Stosowanie:
Dla ciągu zapytania
x=5&y&z=hello&x=6
zwraca obiekt:źródło
(function($) { $.extend({ get_query: function (name) { var url = location.href; 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]] = qs[i][1]; } return result; } }); })(jQuery);
i użyj w ten sposób:$.get_query()
location.href
musiałby zostać zastąpiony przezlocation.search
.Uprość to w prostym kodzie JavaScript:
Zadzwoń z dowolnego miejsca w kodzie JavaScript:
źródło
window.location.search
!To są świetne odpowiedzi, ale potrzebowałem czegoś bardziej solidnego i pomyślałem, że wszyscy chcielibyście mieć to, co stworzyłem.
Jest to prosta metoda biblioteczna, która wykonuje sekcję i manipulowanie parametrami adresów URL. Metoda statyczna ma następujące metody podrzędne, które można wywołać w podanym adresie URL:
Przykład:
źródło
Z MDN :
źródło
Kod golfa:
Pokaż to!
Na moim komputerze Mac:
test.htm?i=can&has=cheezburger
wyświetla sięźródło
Często używam wyrażeń regularnych, ale nie do tego.
Wydaje mi się łatwiejsze i wydajniejsze odczytanie ciągu zapytania w mojej aplikacji i zbudowanie obiektu ze wszystkich par klucz / wartość, takich jak:
Dla takiego adresu URL
http://domain.com?param1=val1¶m2=val2
możesz uzyskać jego wartość później w kodzie jakosearch.param1
isearch.param2
.źródło
źródło
Metoda RosQybo jQuery nie zajmowała się dekodowaniem adresu URL
Właśnie dodałem tę możliwość również podczas dodawania instrukcji return
Teraz możesz znaleźć zaktualizowaną treść:
źródło
Podoba mi się ten (pochodzi z jquery-howto.blogspot.co.uk):
Działa świetnie dla mnie.
źródło
Oto moja edycja tej doskonałej odpowiedzi - z dodatkową możliwością analizowania ciągów zapytań za pomocą kluczy bez wartości.
WAŻNY! Parametr tej funkcji w ostatnim wierszu jest inny. To tylko przykład tego, jak można przekazać do niego dowolny adres URL. Możesz użyć ostatniego wiersza z odpowiedzi Bruno, aby przeanalizować bieżący adres URL.
Co dokładnie się zmieniło? W przypadku adresu URL
http://sb.com/reg/step1?param=
wyniki będą takie same. Ale z adresem URLhttp://sb.com/reg/step1?param
rozwiązanie Bruno zwraca obiekt bez kluczy, a mój zwraca obiekt z kluczemparam
iundefined
wartością.źródło
Potrzebowałem obiektu z ciągu zapytania i nie znoszę dużo kodu. Może nie jest to najbardziej niezawodny we wszechświecie, ale to tylko kilka linii kodu.
Adres URL typu
this.htm?hello=world&foo=bar
spowoduje utworzenie:źródło
decodeURIComponent
wartość podczas przechowywania - i prawdopodobnie również klucz, ale mniej prawdopodobne jest użycie w tym celu nieparzystych ciągów.?a&b&c
ale jest to naprawdę bardzo czytelne (a przy okazji podobne do mojego pierwszego pomysłu). Równieżsplit
jest zbędny, ale mam większą rybę do smażenia niż dwukrotne podzielenie łańcucha 10 znaków.location.search.substr(1)
zamiast,location.href.split('?')[1]
aby uniknąć pobierania hash (#anchor
) wraz z ostatnim parametrem zapytania.location.search
!Oto rozszerzona wersja połączonej wersji Andy E. „Obsługuj ciąg zapytania w stylu tablicy”. Naprawiono błąd (
?key=1&key[]=2&key[]=3
;1
został utracony i zastąpiony przez[2,3]
), wprowadzono kilka drobnych ulepszeń wydajności (ponowne dekodowanie wartości, ponowne obliczenie pozycji „[” itp.) I dodano szereg ulepszeń (funkcjonalizowany, obsługa?key=1&key=2
, obsługa;
ograniczników) . Zmienne zostawiłem irytująco krótkie, ale dodałem mnóstwo komentarzy, aby były czytelne (och, i ponownie użyłemv
funkcji lokalnych, przepraszam, jeśli jest to mylące;).Będzie obsługiwał następujące kwerendy ...
... przekształcając go w obiekt, który wygląda jak ...
Jak widać powyżej, ta wersja obsługuje pewną miarę tablic „zniekształconych”, tj. -
person=neek&person[]=jeff&person[]=jim
lubperson=neek&person=jeff&person=jim
ponieważ klucz jest identyfikowalny i ważny (przynajmniej w NameValueCollection.Add dotNet ):Wygląda na to, że jury ma dość powtarzających się klawiszy, ponieważ nie ma specyfikacji. W takim przypadku wiele kluczy jest przechowywanych jako (fałszywa) tablica. Pamiętaj jednak, że nie przetwarzam wartości na podstawie przecinków w tablice.
Kod:
źródło
q = decodeURIComponent(window.location.search.substring(1)),
pomaga również to zrobić.Jest to funkcja, którą stworzyłem jakiś czas temu i jestem z niej całkiem zadowolony. Nie rozróżnia wielkości liter - co jest przydatne. Ponadto, jeśli żądany QS nie istnieje, po prostu zwraca pusty ciąg.
Używam skompresowanej wersji tego. Wysyłam nieskompresowane typy początkujących, aby lepiej wyjaśnić, co się dzieje.
Jestem pewien, że można to zoptymalizować lub zrobić inaczej, aby działało szybciej, ale zawsze działało świetnie dla tego, czego potrzebuję.
Cieszyć się.
źródło
Właśnie wypuściliśmy arg.js , projekt mający na celu rozwiązanie tego problemu raz na zawsze. Tradycyjnie było to takie trudne, ale teraz możesz zrobić:
lub uzyskanie całej partii:
a jeśli zależy Ci na różnicy między,
?query=true
a#hash=true
następnie możesz użyć metodArg.query()
iArg.hash()
.źródło
Problem z najwyższą odpowiedzią na to pytanie polega na tym, że parametry nie są obsługiwane po #, ale czasem trzeba je również uzyskać.
Zmodyfikowałem odpowiedź, aby parsowała pełny ciąg zapytania ze znakiem skrótu również:
źródło
I w ten sposób możesz użyć tej funkcji, zakładając, że jest to adres URL
źródło
?stringtext&stringword=foo
.Jeśli używasz Browserify, możesz użyć
url
modułu z Node.js :Dalsza lektura: URL Node.js v0.12.2 Podręcznik i dokumentacja
EDYCJA: Możesz użyć interfejsu URL , który jest dość powszechnie przyjęty w prawie wszystkich nowych przeglądarkach, a jeśli kod będzie działał w starej przeglądarce, możesz użyć polifillu takiego jak ten . Oto przykład kodu, w jaki sposób korzystać z interfejsu URL, aby uzyskać parametry zapytania (inaczej parametry wyszukiwania)
Możesz również użyć do tego URLSearchParams, oto przykład z MDN, aby to zrobić z URLSearchParams:
źródło
url
interfejsu API modułu znajduje się tutaj: nodejs.org/api/url.html