JQuery'nin form.serialize kullanıp boş alanları nasıl hariç tutabilirim?


107

Bir GET aracılığıyla gönderilen birkaç metin girişi ve açılır menü içeren bir arama formum var. Bir arama yapıldığında sorgu dizesindeki boş alanları kaldırarak daha temiz bir arama url'sine sahip olmak istiyorum.

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

Bunu jQuery kullanarak nasıl yapabileceğim hakkında bir fikriniz var mı?

Yanıtlar:


167

JQuery belgelerine bakıyordum ve sanırım bunu seçicileri kullanarak tek satırda yapabiliriz :

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

Açıkçası #myForm, "myForm" kimliğine sahip öğeyi alıyor, ancak ilk başta benim için daha az açık olan şey, #myForm ile: input arasında alt operatör olduğu için boşluk karakterinin gerekli olduğuydu .

: giriş , tüm giriş, metin alanı, seçim ve düğme öğeleriyle eşleşir.

[değer! = ''] eşit olmayan bir öznitelik filtresidir. Garip (ve faydalı) şey şudur : giriş öğesi türlerinin değer öznitelikleri vardır, hatta seçimler ve onay kutuları vb.

Son olarak, değerin 'olduğu girdileri de kaldırmak için.' (soruda belirtildiği gibi):

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

Bu durumda yan yana, yani iki öznitelik seçicinin yan yana yerleştirilmesi , bir AND anlamına gelir. Virgül kullanmak , VEYA anlamına gelir. Özür dilerim, CSS kullanıcıları için bu açıksa!


3
@Mvision, çünkü bu yanıtta küçük ama önemli bir eksiklik var. JQuery 1.8 ve önceki sürümlerdeki normal / saf CSS seçiciler [value]için , boş değerlere sahip olanlar (veya hiç olmayanlar) dahil olmak üzere , value mevcut öznitelikle herhangi bir öğeyi eşleştirir . Bunun nedeni, önceki jQuery sürümlerindeki ve belirli varyasyonları arasında tutarsızlık oluşturan bir hatadır . Örneğin ; böcek bu kemanla resmedilmiştir . input[value]:input[value]<input value="foo"><input value=""><input value><input>
Noyo

4
Benim için bu işe yaradı: $form.find(":input[value]")- boş alanlar seçilmedi. Bu işe yaramadı: $form.find(":input[value!='']")- tüm alanlar seçildi. Umarım bu birine yardımcı olur. (jQuery 2.0.0)
Ryan Wheale

1
$form.find(":input[value]")benim için de çalıştı (jQuery 1.11.0)
GSTAR

Yalnızca valueöznitelik zaten oradaysa çalıştı . Başka türlü tanımadı.
starcorn

1
valueProgramlı olarak ayarlandığı bazı durumlarda , bu işe yaramayacaktır ( valuebir HTML niteliği olarak mevcut olmayacaktır, ancak girişte bir veri özelliği olarak olacaktır). Bu gibi durumlarda, bu deneyin: $('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize(). DÜZENLEME: Rich'in aynı etkiye cevabını şimdi gördüm.
Fateh Khalsa

54

Tom'un çözümünün çalışmasını sağlayamadım (?), Ancak bunu .filter()boş alanları belirlemek için kısa bir işlev kullanarak yapabildim . JQuery 2.1.1 kullanıyorum.

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

2
Onaylanmış yanıt işe yaramadı, ancak bu harika çalıştı! Teşekkürler!
bfritz

Kendi sorumu yanıtlıyorum: " :inputSeçici temelde tüm form kontrollerini seçer. Tüm giriş, metin alanı, seçim ve düğme öğelerini seçer." kaynak
Dinei

Evet, Tom bozuldu . Seninki de benim o kemanla uğraşmamdan daha temiz. Up'd
Hashbrown

11

Bu benim için çalışıyor:

data = $( "#my_form input").filter(function () {
        return !!this.value;
    }).serialize();

Geri çağırma, geçiş değerlerinin !!doğruya dönmesine izin verir, bool için her şeyi yeniden yazar, konsolda deneyebilirsiniz. !!('test'), !!(5),!!(0)
Aiphee

2
Ve inputseçici yerine, :input
seçimleri

Bu değişikliği öneriyorum:data = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Mahoor13

9

Bunu bir normal ifadeyle yapabilirsin ...

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

Test durumları:

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

.replace (/[ ^ ]]+=\.?(& | $) / g, '') her iki durumu da kapsar. Ancak sondaki &
Tom Viner 04

15
Normal ifadenin daha kötü hale getiremeyeceği bir sorun yoktur.
Michael Cook

3

Yukarıdaki çözümü kullandım ama benim için işe yaramadı. Bu yüzden aşağıdaki kodu kullandım

$('#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;
        });

Birisi için yararlı olabilir


1

JQuery için kaynak koduna bakardım. En son sürüm satırında 3287.

"Serialize2" ve "serializeArray2" işlevlerini ekleyebilirim. elbette onlara acımasız bir isim verin.

Veya daha iyi bir yol, kullanılmayan değişkenleri serializedFormStr'den çıkarmak için bir şeyler yazmaktır. Orta dizede = & ifadesini arayan veya = ile biten bazı normal ifadeler = Etrafta herhangi bir normal ifade sihirbazı var mı?

GÜNCELLEME: rogeriopvl'in cevabını daha çok seviyorum (+1) ... özellikle şu anda iyi bir regex aracı bulamadığım için.


1

Rich'in çözümüne bir alternatif :

$('#form').submit(function (e) {
  e.preventDefault();

  var query = $(this).serializeArray().filter(function (i) {
    return i.value;
  });

   window.location.href = $(this).attr('action') + (query ? '?' + $.param(query) : '');
});

Açıklamalar:

  • .submit()formun submitolayına bağlanır
  • e.preventDefault() formun gönderilmesini engeller
  • .serializeArray() bize gönderilecek sorgu dizesinin dizi temsilini verir.
  • .filter() Bu dizideki hatalı (boş dahil) değerleri kaldırır.
  • $.param(query) güncellenmiş dizimizin serileştirilmiş ve URL uyumlu bir temsilini oluşturur
  • window.location.hrefisteği göndermek için bir değer ayarlamak

0

Kahve kağıdında şunu yapın:

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

-1

Bir seçicinin her öğesini yinelemenizi sağlayan .each () jquery işlevine bakmak isteyebilirsiniz, böylece bu şekilde her bir giriş alanını kontrol edebilir ve boş olup olmadığını görebilir ve ardından formdan kaldırabilirsiniz. element.remove () kullanarak. Bundan sonra formu seri hale getirebilirsiniz.


1
Bununla ilgili tek sorun, kullanıcının, sayfa gönderilmeden hemen önce kontrollerden boş olanların kaybolduğunu görmesidir. İsmi "" olarak ayarlamak daha iyi olur, bu yüzden serialize bunu göz ardı eder.
Tom Viner 04
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.