2010-03-10 21 views
29

Bir formdaki değişiklikleri yakalayan ve formun düzenli gönderme işlevini çağıran bazı javascript'im var. Form bir GET formudur (bir arama için) ve paramda birçok boş öznitelik var. Ne yapmam istiyorum daha temiz bir URL almak için, göndermeden önce boş özelliklerini silmektir: Birisi 'konusunu' değişirse örneğin, 'ingilizce' i kendi arama url olmak istemek seçmekFormları göndermeden önce boş değerleri silme

http://localhost:3000/quizzes?subject=English 

yerine

http://localhost:3000/quizzes?term=&subject=English&topic=&age_group_id=&difficulty_id=&made_by=&order=&style= 

daha şu anda olduğu gibi. Bu, yalnızca insanların yer imleri ve vb. Için daha temiz ve daha anlamlı bir URL'ye sahip olmak amacına yöneliktir. Yani, ihtiyacım olan şey bu satırlar boyunca bir şeydir, ancak bu gerçek formu düzenlemediğim için doğru değildir. ancak formun params yapılan bir js nesnesi:

quizSearchForm = jQuery("#searchForm"); 
    formParams = quizSearchForm.serializeArray(); 
    //remove any empty fields from the form params before submitting, for a cleaner url 
    //this won't work as we're not changing the form, just an object made from it. 
    for (i in formParams) { 
    if (formParams[i] === null || formParams[i] === "") { 
     delete formParams[i]; 
    } 
    } 
    //submit the form 

Ben bu yakın olduğumu düşünüyorum, ama asıl formun özelliklerini düzenlemek yerine başka bir nesneyi bulunmak ve o nasıl düzenleneceği adımını kaçırıyorum. ÇÖZÜLDÜ - - DÜZENLEME

max - Herhangi bir tavsiye için minnettar

bu konuda yayınlanan birçok kişiye teşekkürler. İşte sahip olduğum şey mükemmel çalışıyor gibi görünüyor. Eğer formun submit yöntemini çağırırsanız

function submitSearchForm(){ 
    quizSearchForm = jQuery("#searchForm"); 
    //disable empty fields so they don't clutter up the url 
    quizSearchForm.find(':input[value=""]').attr('disabled', true); 
    quizSearchForm.submit(); 
} 
+5

Sadece diyebilir, çok böyle kullanıcıların sizin düşünme serin oluyor. –

+0

İyi soru ve güzel cevaplar: Büyük bir arama formum var ve çoğu zaman sadece bir alan doldu. Artık URL'ler çok daha kısa. – guettli

cevap

29

disabled özniteliği true olarak ayarlanmış girişler formda gönderilmez. Yani bir jQuery doğrultusunda: - belki başkası yararlanabilir

$(':input[value=""]').attr('disabled', true); 
+2

Öyleyse neden sadece: $ (': input [value = ""]'). Attr ('disabled', true); –

+0

@Marko Dumic - 'attr 'sadece sonuçtaki koleksiyonda * ilk * öğe üzerinde hareket edecektir. – karim79

+0

@ karim79: Yanlış. Deneyin: http://jsfiddle.net/EfwBC/ –

4

Bu şekilde mi yapamaz; jQuery'nin sizin için oluşturduğu dizi değil, tüm formu gönderecek.

Yapabilecekleriniz, formu göndermeden önce boş olan form alanlarını devre dışı bırakmaktır; devre dışı bırakılan alanlar form gönderiminden çıkarılmıştır. Bu nedenle, formun öğelerini ve boş olan her birini gözden geçirin, devre dışı bırakın ve formdaki submit yöntemini çağırın. (Hedefi başka bir pencere ise, o zaman geri gitmek ve alanları yeniden etkinleştirmek istersiniz. Hedefi, geçerli pencere ise, önemli değil, sayfa zaten değiştirilecektir.)

3

Peki

$('#searchForm').find('input, textarea, select').each(function(_, inp) { 
    if ($(inp).val() === '' || $(inp).val() === null) 
    inp.disabled = true; 
    } 
}); 

"serializeArray()" rutin kendi sonuçlarında bu içermeyecektir yapabileceğin bir şey "serializeArray" çağırmadan önce boş girişler devre dışı olacaktır. Şimdi, form defterinin tamamen yenilenmiş bir sayfaya neden olmazsa, geri dönüp yeniden etkinleştirmeniz gerekebilir.

+0

Eğer formun kendi 'submit' yöntemini çağırıyorsa, 'serializeArray' çağırması gerekmez. –

+0

Evet, bu doğru, ancak kod örneği kesiliyor ve her şeyden önce serializeArray'i çağırdı. Bahsettiğiniz gibi alanları normal bir gönderim sırasında da devre dışı bırakmak için çalışacaktır. – Pointy

18
$('form#searchForm').submit(function() { 
    $(':input', this).each(function() { 
     this.disabled = !($(this).val()); 
    }); 
}); 
+0

Bu benim için daha iyi çalışır, çünkü Enter tuşuna bastığımda odaklanmış giriş alanında yeni düzenlenmiş değeri dikkate alır. – warvariuc

+0

Doğru cevap budur. http://stackoverflow.com/a/2418022/431698, yeni düzenlenen değeri dikkate almaz. –

1

senin sorunun bana biraz farklı durumumu, anlamaya yardımcı oldu. Bir formu doğrudan göndermek yerine, boş form öğelerinin, AJAX aracılığıyla gönderilen ve ardından numaralı seri hale getirilmiş bir dizide toplanmasını önlemem gerekiyordu.

Benim durumumda

, ben sadece kalıp elemanları içinden döngü için gerekli ve bu yüzden böyle bir diziye kalanlar toplamak sonra boş hepsi devre dışı bırakabilir ve: Hep tavsiye başka bir yaklaşım yapmaktır

// Loop through empty fields and disable them to prevent inclusion in array 
$('#OptionB input, select').each(function(){ 
    if($(this).val()==''){ 
     $(this).attr('disabled', true); 
    } 
}); 

// Collect active fields into array to submit 
var updateData = $('#OptionB input, select').serializeArray(); 
0

o Eğer edebiliyoruz sunucu tarafında, yani: doğru giriş veri

  • Seti varsayılan değerler
  • Değişim girdi değerleri ise

    1. doğrula'da n
    2. temiz bir URL veya örneğin "/ sınavlar/ingilizce/seviye-1 /" Aksi

    metin girişi seçin, radyo vb ile uğraşmak zorunda kalacak ...

    gibi bir dost URL Var eeded
  • +0

    Merhaba Thomas. Sunucu tarafı doğrulamasını da kullanıyorum, ancak bu durumda elde etmek istediğim şey, arama parametrelerindeki tek parametrelerin boş olmayanlar olduğu bir url idi. Bu sunucu tarafında herhangi bir fark yaratmaz ama güzel URL'ler verir. –

    2

    Belki de önerilen çözümlerin bir kısmı, soru sorulmakta iken çalıştı (Mart 2010) ancak bugün, Ağustos 2014, boş girişlerin devre dışı bırakılması çözümü işe yaramıyor. Google Chrome'umda devre dışı alanlar da gönderiliyor. Ancak "name" özelliğini kaldırmayı denedim ve iyi çalıştı!

    $('form').submit(function(){ 
        $(this).find('input[name], select[name]').each(function(){ 
         if (!$(this).val()){ 
          $(this).removeAttr('name'); 
         } 
        }); 
    }); 
    

    Güncelleme: Bana çalıştı gelmez alanları devre dışı bir şeyin 2010 yılından beri değişti Ama yine benim Google Chrome'da çalışmıyor olmadığı için Tamam, muhtemelen nedeni. Bilmiyorum, belki sadece linux versiyonunda. Her neyse, isminin kaldırılmasının daha iyi olduğuna inanıyorum, çünkü bu politika, tarayıcıyı devre dışı alanlarla ilgili olarak alır, ancak eğer isim eksikse parametreleri göndermenin bir yolu yoktur. Diğer bir avantaj ise, genellikle devre dışı bırakılan alanların bazı stil değişikliklerine işaret etmesidir ve formun nihayet gönderilmesinden önce formda bir stil değişikliğini görmek hoş değildir. Ayrıca, Max Williams'ın açıklamalarda bahsettiği gibi bir dezavantajı vardır, çünkü kaldırma adı attr çözümü değiştirilemez.

    $('form').submit(function(){ 
        $(this).find('input[name], select[name]').each(function(){ 
         if (!$(this).val()){ 
          $(this).data('name', $(this).attr('name')); 
          $(this).removeAttr('name'); 
         } 
        }); 
    }); 
    
    function recoverNames(){ 
        $(this).find('input[name], select[name]').each(function(){ 
         if ($(this).data('name')){ 
          $(this).attr('name', $(this).data('name')); 
         } 
        }); 
    } 
    

    Ancak, eksik isim attrs kurtarmak için gerek yoktur varsayılmıştır yüzden formunu gönderdiğinizi beri bu çok yaygın bir durum olmadığını düşünüyorum: Bu sorunu önlemek için bir yoldur.

    +1

    Krom kullanıyorum ve girişlerin bir formda devre dışı bırakılması, gönderilmedikleri anlamına gelir. Bunun 2010'dan bu yana değiştiğini düşünmüyorum. Ad niteliğini kaldırarak bunu yapmayla ilgili sorun, geçiş yapamayacağınız, yani adı bir kere ekledikten sonra, bir yere kaydetmediğiniz sürece . –

    1

    Veya serialize, regex ile açık boş anahtar = değer çiftleri ve çağrı window.location:

    $("#form").submit(function(e){ 
        e.preventDefault(); 
        //convert form to query string, i.e. a=1&b=&c=, then cleanup with regex 
        var q = $(this).serialize().replace(/&?[\w\-\d_]+=&|&?[\w\-\d_]+=$/gi,""), 
        url = this.getAttribute('action')+ (q.length > 0 ? "?"+q : ""); 
        window.location.href = url; 
    }); 
    
    İlgili konular