Biorąc pod uwagę następujący formularz:
<form>
<input name="foo" value="bar">
<input name="hello" value="hello world">
</form>
Potrafię użyć $.param( .. )
konstrukcji do serializacji formularza:
$.param( $('form input') )
=> foo=bar&hello=hello+world
Jak mogę deserializować powyższy ciąg za pomocą JavaScript i odzyskać skrót?
Na przykład,
$.magicFunction("foo=bar&hello=hello+world")
=> {'foo' : 'bar', 'hello' : 'hello world'}
Numer referencyjny: jQuery.param( obj )
.
javascript
jquery
seb
źródło
źródło
+
. Teraz zastępuje je wszystkie!QueryString
. Zrobiłem jeden, ale nie akceptuje parametrów, czyta tylko z window.location.search. Pamiętam inne, które akceptują parametry ...Odpowiedzi:
Należy użyć jQuery BBQ „s deparam funkcję. Jest dobrze przetestowany i udokumentowany.
źródło
To jest nieco zmodyfikowana wersja funkcji, którą napisałem jakiś czas temu, aby zrobić coś podobnego.
źródło
A co z tym krótkim, funkcjonalnym podejściem?
Przykład:
źródło
field[][]=a&field[0][]=b&field[0][]=c
jest przetwarzany tak, jakObject { field[][]: "a", field[0][]: "c" }
powinienresultobject.field[0] = Array [ "a", "b", "c" ]
. Jest to zachowanie zgodne z oczekiwaniami w PHP. Rozwiązanie @ JackyLi dba o to.Moja odpowiedź:
źródło
JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)
, dostaję,{"2":["2"],"3":["4"],"":"cc"}
a nie[null,null,[2],[3,4],"bb","cc"]
to, czego bym się spodziewał (to jest to, co dałby mi PHP).Korzystam z odpowiedzi Davida Dorwarda i zdałem sobie sprawę, że nie zachowuje się jak PHP lub Ruby on Rails, jak analizują parametry:
1) zmienna jest tablicą tylko wtedy, gdy kończy się na
[]
, na przykład, a?choice[]=1&choice[]=12
nie wtedy, gdy jest?a=1&a=2
2) gdy istnieje wiele parametrów o tej samej nazwie, późniejsze zastępują wcześniejsze, tak jak na serwerach PHP (Ruby on Rails zachowuje pierwszy i ignoruje późniejsze), np.
?a=1&b=2&a=3
Modyfikując wersję Davida, mam:
który jest dość dokładnie testowany.
źródło
hash[k.substr(0, k.length-2)] = [v];
ihash[k.substr(0, k.length-2)].push(v);
Wiem, że to stary wątek, ale może jest w nim jeszcze jakieś znaczenie?
Zainspirowany dobrym rozwiązaniem Jacky Li, wypróbowałem własną, niewielką odmianę, mając na celu możliwość obsługi dowolnych kombinacji tablic i obiektów jako danych wejściowych. Przyjrzałem się, jak PHP by to zrobił i spróbowałem uzyskać coś „podobnego”. Oto mój kod:
Jeśli funkcja zostanie wywołana bez
str
-argumentu, zostanie przyjętawindow.location.search.slice(1)
jako dane wejściowe.Kilka przykładów:
prowadzi do
Podczas gdy rozwiązanie Jacky Li stworzyłoby zewnętrzny pojemnik
a
jako zwykły przedmiotgetargs()
sprawdza pierwszy podany indeks dla dowolnego poziomu, aby określić, czy ten poziom będzie obiektem (indeks nieliczbowy) czy tablicą (numeryczną lub pustą), w wyniku czego otrzymamy wynik, jak pokazano na liście powyżej (nr 6).Jeśli bieżący obiekt jest tablicą, to
null
s są wstawiane wszędzie tam, gdzie jest to konieczne, aby przedstawić puste pozycje. Tablice są zawsze numerowane kolejno i oparte na 0).Zauważ, że w przykładzie nr. 8 "autoinkrementacja" dla pustych indeksów nadal działa, mimo że mamy teraz do czynienia z obiektem, a nie tablicą.
O ile to przetestowałem, mój
getargs()
zachowuje się prawie identycznie jak świetna$.deparam()
wtyczka jQuery Chrissa Rogera wspomniana w zaakceptowanej odpowiedzi. Główną różnicą jest to, żegetargs
działa bez jQuery i robi autoinkrementację w obiektach, ale$.deparam()
tego nie robi:prowadzi do
W
$.deparam()
indeksie[]
jest interpretowany jakoundefined
zamiast indeksu liczbowego z autoinkrementacją.źródło
o[k]=isNaN(idx[0])?{}:[];
z zamiarem utworzenia tablicy, ilekroć napotkam indeks numeryczny jako pierwszy podany dla nowego obiektu. W przeciwnym razie utworzę ogólny obiekt. Do Ciebie należy modyfikacja tej części kodu, aby lepiej odpowiadała Twoim potrzebom. I. e. coś takiegoo[k]={}
powinno załatwić sprawę.Oto, jak możesz utworzyć nową funkcję jQuery:
źródło
true
aby można było sprawdzićif (params.redirect)
lub podobnie. Jeśli chcesz się różnićtrue
innymi wartościami, użyjif (params.redirect === true)
.null
Wartość nie pomoże w żaden sposób, że mogę myśleć. Powodem, dla którego nie zrobiłem tego tak jak David, jest to, że cenię konsekwencję ponad elastyczność. Za pomocą jego metody muszę sprawdzić, czy wartość jest łańcuchem, czy tablicą, aby użyć jej wartości. Moim zdaniem zawsze powinien to być ciąg znaków (true
konwertowana wartość, do'true'
której myślę, że jest w porządku) lub zawsze tablica. Wybrałem sznurek./abc?delete
, spodziewałbym się, że będzie tam wpisdelete
. Nie rozumiem, czym to się różni? Nie rozumiem nawet, jak możesz preferować inny kod z tego powodu, ponieważ ten kod ustawi wartość na ciąg,'undefined'
który nie jest lepszy. A jeśli chodzi o wiele wartości, to kwestia prostoty kontra elastyczność. Rzadko widzę użycie wielu wartości w ciągach zapytań, ale jeśli ich potrzebujesz, zawsze zwracaj tablicę z 1+ wartościami. Nigdy nie mieszaj typu powrotu; wtedy będziesz musiał spędzić czas do debugowania, ponieważ to, co zwykle nagle ciąg mógłby być tablicą.Dzięki niemu http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
Całkiem proste: D
źródło
?something=1¶m2=value2
w tablicy. Co masz na myśli, mówiąc „nie działają z polami wyboru z wieloma opcjami”?Oto moja implementacja JavaScript, której używam na stronie serwera JScript ASP Classic ( demonstracja ):
źródło
Użyj tego :
źródło
Wymyśliłem takie rozwiązanie, które zachowuje się jak funkcja .Net
HttpUtility.ParseQueryString
.W rezultacie parametry ciągu zapytania są przechowywane we właściwościach jako listy wartości, więc
qsObj["param"]
będzie to to samo, co wywołanieGetValues("param")
.Net.Mam nadzieję, że to lubisz. JQuery nie jest wymagane.
Oto jak z niego korzystać:
Aby wyświetlić podgląd wyniku w konsoli juste, wpisz:
Wynik:
źródło
W CSS-Tricks (oryginalne źródło od Nicholasa Ortenzio ) jest piękny, jednoliniowy tekst :
Naprawdę sprytną częścią jest sposób, w jaki wykorzystuje
this
obiekt funkcji anonimowej , dodając parę klucz / wartość dla każdego zapytania w ciągu. To powiedziawszy, jest miejsce na poprawę. Zmodyfikowałem go nieco poniżej, wprowadzając następujące zmiany:Dodano obsługę pustych ciągów i danych wejściowych niebędących ciągami.
Obsługiwane ciągi zakodowane w identyfikatorze URI (
%40
->@
itd.).Usunięto domyślne użycie,
document.location.search
gdy dane wejściowe były puste.Zmieniono nazwę, uczyniłem ją bardziej czytelną, dodano komentarze.
źródło
To naprawdę stare pytanie, ale w miarę zbliżania się - inne osoby mogą przyjść do tego posta, a ja chcę trochę odświeżyć ten motyw. Dziś nie ma potrzeby tworzenia niestandardowych rozwiązań - jest interfejs URLSearchParams .
Jedyne ograniczenie, które znam - ta funkcja nie jest obsługiwana w IE / Edge.
źródło
To jest moja wersja w Coffeescript. Działa również w przypadku adresów URL, takich jak
http://localhost:4567/index.html?hello=[%22world%22]&world=hello#/home
źródło
Oto prosty i kompaktowy, jeśli chcesz tylko szybko uzyskać parametry z żądania GET:
Konwertuje
w obiekt taki jak
źródło
Tworzy serializowaną reprezentację tablicy lub obiektu (może służyć jako ciąg zapytania URL dla żądań AJAX).
źródło
odpowiedzi przydałoby się odrobinę elegancji jQuery :
widelec na https://gist.github.com/956897
źródło
Możesz użyć funkcji
.serializeArray()
( Link ) samego jQuery. Ta funkcja zwraca tablicę par klucz-wartość. Przykład wyniku:źródło