Przeglądałem dokumentację jQuery i myślę, że możemy to zrobić w jednej linii za pomocą selektorów :
$("#myForm :input[value!='']").serialize() // does the job!
Oczywiście #myForm pobiera element o identyfikatorze „myForm”, ale na początku mniej oczywiste było dla mnie to, że znak spacji jest potrzebny między #myForm a: input, ponieważ jest to operator potomka .
: input pasuje do wszystkich elementów input, textarea, select i button.
[wartość! = ''] nie jest równym filtrem atrybutu. Dziwne (i pomocne) jest to, że wszystkie typy elementów wejściowych mają atrybuty wartości, a nawet zaznaczenia i pola wyboru itp.
Wreszcie, aby usunąć również dane wejściowe, w których wartość wynosiła „.” (jak wspomniano w pytaniu):
$("#myForm :input[value!=''][value!='.']").serialize()
W tym przypadku zestawienie, tj. Umieszczenie obok siebie dwóch selektorów atrybutów , implikuje AND. Użycie przecinka implikuje OR. Przepraszam, jeśli to oczywiste dla ludzi CSS!
[value]
dopasowuje dowolny element zvalue
obecnym atrybutem , w tym te z pustymi wartościami (lub bez). Wynika to z błędu we wcześniejszych wersjach jQuery, który spowodował niespójność między niektórymi odmianamiinput[value]
i:input[value]
. Weźmy na przykład<input value="foo"><input value=""><input value><input>
; błąd jest zilustrowany na tych skrzypcach .$form.find(":input[value]")
- puste pola nie zostały wybrane. To nie zadziałało:$form.find(":input[value!='']")
- wszystkie pola zostały wybrane. Mam nadzieję, że to komuś pomoże. (jQuery 2.0.0)$form.find(":input[value]")
również pracował dla mnie (jQuery 1.11.0)value
atrybut już tam był. Inaczej tego nie rozpoznał.value
jest ustawiany programowo, to nie zadziała (value
nie będzie istnieć jako atrybut HTML, ale będzie jako atrybut danych na wejściu). W tych przypadkach, spróbuj tego:$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()
. EDYCJA: Właśnie zobaczyłem odpowiedź Richa na ten sam efekt.Nie byłem w stanie zmusić rozwiązania Toma do działania (?), Ale udało mi się to zrobić za
.filter()
pomocą krótkiej funkcji do identyfikacji pustych pól. Używam jQuery 2.1.1.źródło
:input
Selektor zasadniczo wybiera wszystkie kontrolki formularza. Zaznacza wszystkie elementy wejściowe, tekstowe, zaznaczania i przyciski”. źródłoTo działa dla mnie:
źródło
!!
funkcja zwrotna pozwala przekazywać wartości zwracające prawdę, przepisuje wszystko na bool, możesz spróbować w konsoli.!!('test')
,!!(5)
,!!(0)
input
selektora powinno być:input
włączaniedata = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Możesz to zrobić za pomocą wyrażenia regularnego ...
Przypadki testowe:
źródło
Użyłem powyższego rozwiązania, ale u mnie te nie zadziałały. Więc użyłem następującego kodu
Może się komuś przydać
źródło
Spojrzałbym na kod źródłowy jQuery. W najnowszej wersji linia 3287.
Mógłbym dodać funkcje „serialize2” i „serializeArray2”. oczywiście nazwij ich coś podłego.
Lub lepszym sposobem byłoby napisanie czegoś, co spowoduje wyciągnięcie nieużywanych zmiennych z serializedFormStr. Jakieś wyrażenie regularne szukające = & w środku ciągu lub kończące się na = Czy są w pobliżu jakieś kreatory wyrażeń regularnych?
AKTUALIZACJA: Bardziej podoba mi się odpowiedź rogeriopvl (+1) ... zwłaszcza, że nie mogę teraz znaleźć żadnych dobrych narzędzi do wyrażeń regularnych.
źródło
Alternatywa dla rozwiązania Richa :
Objaśnienia:
.submit()
zaczepia się o formularzsubmit
zdarzeniee.preventDefault()
uniemożliwia przesłanie formularza.serializeArray()
daje nam tablicę reprezentującą ciąg zapytania, który miał zostać wysłany..filter()
usuwa fałszywe (w tym puste) wartości z tej tablicy.$.param(query)
tworzy serializowaną i zgodną z adresem URL reprezentację naszej zaktualizowanej tablicywindow.location.href
wysłania żądaniaźródło
W Coffeescript zrób to:
źródło
Możesz zajrzeć do funkcji .each () jquery, która pozwala na iterację przez każdy element selektora, więc w ten sposób możesz sprawdzić każde pole wejściowe i zobaczyć, czy jest puste, czy nie, a następnie usunąć je z formularza przy użyciu elementu.remove (). Następnie możesz serializować formularz.
źródło