2009-03-03 8 views
91

Mam formularz wyszukiwania z wieloma wpisami tekstowymi & drop-downs, które przesyła za pośrednictwem GET. Chciałbym mieć czystszy adres URL wyszukiwania, usuwając puste pola z zapytania, gdy wykonywane jest wyszukiwanie.Jak korzystać z formularza jQuery.serialize, ale wyklucz puste pola

var form = $("form"); 
var serializedFormStr = form.serialize(); 
// I'd like to remove inputs where value is '' or '.' here 
window.location.href = '/search?' + serializedFormStr 

Każdy pomysł, jak mogę to zrobić za pomocą jQuery?

Odpowiedz

151

Szukałem nad jQuery docs i myślę, że możemy to zrobić w jednej linii przy użyciu selectors:

$("#myForm :input[value!='']").serialize() // does the job! 

Oczywiście #myForm pobiera element o identyfikatorze "myForm", ale to, co było mniej ob Początkowo zakładałem, że wymagany jest znak przestrzeni pomiędzy #myForm i: input, ponieważ jest to operator descendant.

:input dopasowuje wszystkie elementy wejściowe, tekstowe, elementy wyboru i przyciski.

[value!=''] jest atrybutem nie równym filtrem. Dziwne (i pomocne) jest to, że wszystkie: dane wejściowe typy elementów mają atrybuty wartości, a nawet zaznaczenia i pola wyboru itp.

Wreszcie, aby również usunąć wejścia, w których wartość była "." (Jak wspomniano w pytaniu):

$("#myForm :input[value!=''][value!='.']").serialize() 

W tym przypadku zestawienia, czyli placing two attribute selectors next to each other implikuje AND. Using a comma oznacza OR. Przepraszam, jeśli to oczywiste dla ludzi CSS!

+6

[wartość] nie działała dla mnie w jquery 1.7.2, [wartość! = ''] Zrobiła –

+2

@Mvision, to dlatego, że w tej odpowiedzi jest małe, ale znaczące pominięcie. Dla normalnych/czystych selektorów CSS w jQuery 1.8 i wcześniejszych, '[value]' pasuje do dowolnego elementu z atrybutem 'value' * present *, ** tym ** z pustymi wartościami (lub nie). Jest to spowodowane błędem we wcześniejszych wersjach jQuery, które spowodowało niespójność między pewnymi odmianami 'input [value]' i ': input [value]'. Weźmy na przykład ''; błąd jest zilustrowany w [tym skrzypku] (http://jsfiddle.net/cxUux/). – Noyo

+0

dzięki @Mvision Zmieniłem odpowiedź. –

1

Chciałbym spojrzeć na kod źródłowy dla jQuery. W najnowszej wersji wiersz 3287.

Mogę dodać funkcje "serialize2" i "serializeArray2". oczywiście nazwa ich coś znaczącego.

Lub lepszym sposobem byłoby napisanie czegoś, aby wyciągnąć nieużywane vars z serializedFormStr. Niektóre wyrażeń regularnych, które szukają = & w środku ciągu lub kończące się w = Jakieś kreacje z wyrażeniem regularnym w pobliżu?

UPDATE: Lubię odpowiedź rogeriopvl za lepsze (+1) ... zwłaszcza, że ​​nie mogę znaleźć żadnych dobrych narzędzi regex teraz.

-1

Możesz zajrzeć do funkcji jquery .each(), która pozwala na iterację poprzez każdy element selektora, więc w ten sposób możesz sprawdzić każde pole wejściowe i sprawdzić, czy jest puste, czy nie, a następnie usunąć to z formularza przy użyciu elementu.remove(). Następnie możesz serializować formularz.

+1

Jedyny problem z tym jest użytkownik zobaczy pusty z kontroli znikają tuż przed strona twierdzi. Byłoby lepiej ustawić nazwę na "", więc serializacja ignoruje ją. –

+0

@ 7times9, tak masz rację, zapomniałem o tym szczególe. – rogeriopvl

6

Można zrobić to z regex ...

var orig = $('#myForm').serialize(); 
var withoutEmpties = orig.replace(/[^&]+=\.?(?:&|$)/g, '') 

przypadki testowe:

orig = "a=&b=.&c=&d=.&e="; 
new => "" 

orig = "a=&b=bbb&c=.&d=ddd&e="; 
new => "b=bbb&d=ddd&" // dunno if that trailing & is a problem or not 
+0

.replace (/[^&]+=\ .?(& | $)/g, '') obejmuje oba przypadki. Ale dodaję .replace (/ & $ /, ''), aby usunąć końcowe i –

+13

Nie ma problemu, że regex nie może się pogorszyć. –

0

W coffeescript, to zrobić:

serialized_form = $(_.filter($(context).find("form.params input"), (x) -> $(x).val() != '')).serialize() 
1

Użyłem powyżej rozwiązanie, ale dla mnie te nie działało.Tak Użyłem następujący kod

$('#searchform').submit(function(){ 

      var serializedData = $(this).serializeArray(); 
      var query_str = ''; 

      $.each(serializedData, function(i,data){ 
       if($.trim(data['value'])){ 
        query_str += (query_str == '') ? '?' + data['name'] + '=' + data['value'] : '&' + data['name'] + '=' + data['value']; 
       } 
      }); 
      console.log(query_str); 
      return false; 
     }); 

Może być przydatna dla kogoś

38

nie byłem w stanie uzyskać rozwiązanie Toma do pracy (?), Ale udało mi się to zrobić przy użyciu .filter() z krótkim funkcji do identyfikacji pustych pól. Używam jQuery 2.1.1.

var formData = $("#formid :input") 
    .filter(function(index, element) { 
     return $(element).val() != ''; 
    }) 
    .serialize(); 
+2

Nie można uzyskać zatwierdzonej odpowiedzi do pracy, ale działało to świetnie! Dzięki! – bfritz

+0

Czy ': input' działa również dla'