Czy istnieje prosty, jednowierszowy sposób na uzyskanie danych formularza, tak jak by to było, gdyby był on przesyłany w klasyczny sposób oparty tylko na HTML?
Na przykład:
<form>
<input type="radio" name="foo" value="1" checked="checked" />
<input type="radio" name="foo" value="0" />
<input name="bar" value="xxx" />
<select name="this">
<option value="hi" selected="selected">Hi</option>
<option value="ho">Ho</option>
</form>
Wynik:
{
"foo": "1",
"bar": "xxx",
"this": "hi"
}
Coś takiego jest zbyt proste, ponieważ nie obejmuje (poprawnie) obszarów tekstowych, zaznaczeń, przycisków opcji i pól wyboru:
$("#form input").each(function () {
data[theFieldName] = theFieldValue;
});
javascript
jquery
forms
Bart van Heukelom
źródło
źródło
Odpowiedzi:
próbny
źródło
_.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))
Użyj
$('form').serializeArray()
, która zwraca tablicę :Inną opcją jest
$('form').serialize()
, która zwraca ciąg znaków :Spójrz na to demo jsfiddle
źródło
serializeArray
byłby o wiele bardziej przydatny, gdyby zwrócił obiekt z parami klucz-wartośćname="multiple[]"
nie działają. Rozwiązanie dla metody POST jest takie samo, wystarczy użyć $ („forma”). Serialize (). Również metoda POST nie ma limitu 2000 znaków, podobnie jak GET w większości przeglądarek, więc można jej używać nawet w przypadku dość dużych danych.name
atrybut.Zaktualizowana odpowiedź dla 2014: HTML5 FormData to robi
Następnie możesz opublikować formData dokładnie tak, jak jest - zawiera wszystkie nazwy i wartości użyte w formularzu.
źródło
entries()
metodę [strona MDN ].Na podstawie
jQuery.serializeArray
zwraca pary klucz-wartość.źródło
To kiepska odpowiedź, ale pozwól mi wyjaśnić, dlaczego jest to lepsze rozwiązanie:
Prawidłowo obsługujemy przesyłanie formularza, a nie naciśnięcie przycisku. Niektórzy ludzie lubią naciskać enter na polach. Niektóre osoby używają alternatywnych urządzeń wejściowych, takich jak wprowadzanie mowy lub inne urządzenia ułatwiające dostęp. Zajmij się przesłaniem formularza i poprawnie go rozwiąż dla wszystkich.
Wnikamy w dane formularza dla faktycznie przesłanego formularza. Jeśli zmienisz selektor formularza później, nie musisz zmieniać selektorów dla wszystkich pól. Ponadto możesz mieć kilka formularzy o takich samych nazwach wejściowych. Nie trzeba rozróżniać z nadmiernymi identyfikatorami, a co nie, wystarczy śledzić dane wejściowe na podstawie przesłanego formularza. Umożliwia to również użycie jednego modułu obsługi zdarzeń dla wielu formularzy, jeśli jest to odpowiednie w danej sytuacji.
Interfejs FormData jest dość nowy, ale jest dobrze obsługiwany przez przeglądarki. To świetny sposób na zbudowanie tego zbioru danych, aby uzyskać rzeczywiste wartości tego, co jest w formularzu. Bez niego będziesz musiał przejrzeć wszystkie elementy (np. Za pomocą
form.elements
) i dowiedzieć się, co jest zaznaczone, a co nie, jakie są wartości itp. Całkowicie możliwe, jeśli potrzebujesz obsługi starej przeglądarki, ale FormData interfejs jest prostszy.Używam tutaj ES6 ... w żadnym wypadku nie jest to wymóg, więc zmień go ponownie, aby był zgodny z ES5, jeśli potrzebujesz obsługi starej przeglądarki.
źródło
formData.entries()
.formData.foo
jest niezdefiniowany. Jak widać w twojej odpowiedzi.get()
należy wezwać do tego, co moim zdaniem jest niewygodne. Może „nie ujawnia się” przyszło w niewłaściwy sposób. Aby więc wygenerować coś{ foo: 'bar' }
na podstawiesubmit
zdarzenia, musisz iterować je ręcznie. Stąd. To get a plain object from it, see [link]
.xhr.send(formData);
JSON.stringify([...formData])
Lub jeśli chcesz, aby twoje klucze / wartości były oddzielne ...[...formData].reduce((prev, cur) => { prev[cur[0]] = cur[1]; return prev;}, {})
użyj .serializeArray (), aby uzyskać dane w formacie tablicowym, a następnie przekonwertować je na obiekt:
źródło
<input type="checkbox" name="someList" value="one" /> <input type="checkbox" name="someList" value="two" />
. Jeśli oba są zaznaczone, obiekt zawiera tylko drugą wartość pola wyboru.someList
powinien byćtype="radio"
?name:value
Oto naprawdę proste i krótkie rozwiązanie, które nawet nie wymaga Jquery.
źródło
postData
.Jest rok 2019 i jest na to lepszy sposób:
lub jeśli zamiast tego chcesz zwykły Obiekt
chociaż pamiętaj, że nie będzie to działać ze zduplikowanymi kluczami, takimi jak w przypadku wielokrotnego wyboru i duplikowania pól wyboru o tej samej nazwie.
źródło
document.getElementsByClassName
i pętli for, ale hej, wciąż ładniejszy niż wymaganie jQuery itp.document.querySelector
zamiast po prostuquerySelector
.źródło
Używam tego:
jQuery Plugin
Formularz HTML
Uzyskaj dane
źródło
Array
poza tym, możesz chcieć spojrzeć na serialize () ;
źródło
Oto działająca implementacja tylko JavaScript, która poprawnie obsługuje pola wyboru, przyciski opcji i suwaki (prawdopodobnie także inne typy danych wejściowych, ale tylko je przetestowałem).
Przykład roboczy:
edytować:
Jeśli szukasz bardziej kompletnej implementacji, zapoznaj się z tą częścią projektu, dla którego to zrobiłem . W końcu zaktualizuję to pytanie o kompletne rozwiązanie, które wymyśliłem, ale być może będzie to pomocne dla kogoś.
źródło
Jeśli używasz jQuery, oto mała funkcja, która zrobi to, czego szukasz.
Najpierw dodaj identyfikator do formularza (chyba że jest to jedyny formularz na stronie, możesz po prostu użyć „formularza” jako zapytania dom)
Dane wyjściowe wyglądałyby następująco:
źródło
Możesz także użyć obiektów FormData ; Obiekt FormData pozwala skompilować zestaw par klucz / wartość do wysłania za pomocą XMLHttpRequest. Jest przeznaczony przede wszystkim do przesyłania danych formularzy, ale można go używać niezależnie od formularzy w celu przesyłania danych z kluczem.
źródło
Spowoduje to dołączenie wszystkich pól formularza do obiektu JavaScript „res”:
źródło
Podałem odpowiedź, aby również zwrócić wymagany przedmiot.
źródło
foo[bar][] = 'qux'
powinien serializować do{ foo: { bar: [ 'qux' ] } }
.Na podstawie odpowiedzi neuronta stworzyłem prostą metodę JQuery, która pobiera dane formularza w parach klucz-wartość, ale działa w przypadku wielokrotnego wyboru i dla danych wejściowych tablic o nazwie = „przykład []”.
Oto jak jest używany:
Poniżej znajduje się przykład jego definicji i sposobu działania.
źródło
źródło
źródło
możesz użyć tej funkcji do uzyskania obiektu lub kodu JSON z formularza.
do użycia:
źródło
Napisałem bibliotekę, aby rozwiązać ten bardzo problem: JSONForms . Przybiera formę, przechodzi przez każde wejście i buduje obiekt JSON, który można łatwo odczytać.
Powiedz, że masz następującą formę:
Przekazanie formularza do metody kodowania JSONForms powoduje zwrócenie następującego obiektu:
Oto demo ze swoim formularzem.
źródło
Codepen
źródło
Dla tych z Was, którzy wolą
Object
łańcuch zamiast serializowanego (jak ten zwrócony przez$(form).serialize()
i niewielka poprawa$(form).serializeArray()
), skorzystaj z poniższego kodu:Aby go wykonać, po prostu użyj,
Form.serialize(form)
a funkcja zwróciObject
podobny do tego:Jako bonus oznacza to, że nie musisz instalować całego pakietu jQuery tylko dla jednej funkcji serializacji.
źródło
Napisałem funkcję, która zajmuje się wieloma polami wyboru i wieloma zaznaczeniami. W takich przypadkach zwraca tablicę.
źródło
wyświetlanie pól elementu formularza i pliku wejściowego w celu przesłania formularza bez odświeżania strony i pobrania wszystkich wartości z plikiem zawartym w nim tutaj
źródło
Naprawi to problem: nie może działać z wieloma zaznaczeniami.
źródło
Nie jesteście w pełni poprawni. Nie możesz pisać:
Ponieważ w ten sposób, jeśli masz listę wielokrotnego wyboru - jej wartości zostaną zastąpione ostatnią, ponieważ jest przesyłana jako: „param1”: „wartość1”, „param1”: „wartość2”.
Prawidłowe podejście to:
źródło
Ta metoda powinna to zrobić. Serializuje dane formularza, a następnie przekształca je w obiekt. Dba również o grupy pól wyboru.
źródło
name
atrybut.Oto fajna waniliowa funkcja JS, którą napisałem, aby wyodrębnić dane formularza jako obiekt. Posiada również opcje wstawiania dodatków do obiektu i czyszczenia pól wprowadzania formularza.
Oto przykład jego użycia z żądaniem postu:
źródło