2009-03-03 10 views
91

मेरे पास एक टेक्स्ट फॉर्म & ड्रॉप डाउन के साथ एक खोज फ़ॉर्म है जो एक GET के माध्यम से सबमिट करता है। एक खोज निष्पादित होने पर क्वेरीस्ट्रिंग से रिक्त फ़ील्ड को हटाकर मैं एक क्लीनर खोज यूआरएल चाहता हूं।मैं jQuery के form.serialize का उपयोग कैसे करूं लेकिन खाली फ़ील्ड को छोड़कर

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

कोई विचार मैं jQuery का उपयोग करके यह कैसे कर सकता हूं?

उत्तर

151

मैं jQuery docs से अधिक के लिए देख रहे हैं और मुझे लगता है कि हम प्रयोग कर एक पंक्ति में ऐसा कर सकते हैं selectors:

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

जाहिर #myForm आईडी "MyForm" लेकिन क्या साथ तत्व हो जाता है कम ओब था मेरे लिए उत्सुकता यह थी कि स्पेस कैरेक्टर #myForm और इनपुट के बीच आवश्यक है क्योंकि यह descendant ऑपरेटर है।

:input सभी इनपुट, टेक्स्टरेरा, चयन और बटन तत्वों से मेल खाता है।

[value!=''] एक विशेषता बराबर फ़िल्टर नहीं है। इनपुट तत्व प्रकार मूल्य भी चयन और चेक बॉक्स आदि

अंत में जहां मूल्य था भी आदानों दूर करने के लिए जिम्मेदार बताते है अजीब (और मददगार) बात यह है कि सब है '।' (प्रश्न में उल्लेख किया):

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

इस मामले निकटता में, यानी placing two attribute selectors next to each other, एक और निकलता है। Using a comma एक याहू का तात्पर्य है। क्षमा करें अगर यह सीएसएस लोगों के लिए स्पष्ट है!

+6

[value] jquery 1.7.2 में मेरे लिए काम नहीं किया, [value! = ''] –

+2

@Mvision था, ऐसा इसलिए है क्योंकि इस उत्तर में एक छोटा लेकिन महत्वपूर्ण चूक है। JQuery 1.8 और पहले में सामान्य/शुद्ध सीएसएस चयनकर्ताओं के लिए, '[value]' विशेषता 'मान' * वर्तमान *, ** के साथ किसी भी तत्व से मेल खाता है ** ** जिनमें खाली मूल्य (या नहीं) मान हैं। यह पिछले jQuery संस्करणों में एक बग के कारण है जिसने 'इनपुट [मूल्य]' और ': इनपुट [मान]' के कुछ भिन्नताओं के बीच असंगतता पैदा की है। उदाहरण के लिए, '<इनपुट मूल्य = "foo"><इनपुट मूल्य = ""> '; बग [इस पहेली] में दिखाया गया है (http://jsfiddle.net/cxUux/)। – Noyo

+0

धन्यवाद @Mvision मैंने जवाब बदल दिया है। –

1

मैं jQuery के लिए स्रोत कोड देखेंगे। नवीनतम संस्करण लाइन 3287 में।

मैं "serialize2" और "serializeArray2" फ़ंक्शंस में जोड़ सकता हूं। बेशक उन्हें कुछ अर्थपूर्ण नाम दें।

या बेहतर तरीके से serializedFormStr से अप्रयुक्त वर्रों को खींचने के लिए कुछ लिखना होगा। कुछ regex जो मध्य स्ट्रिंग में = & और = में समाप्त होने के लिए किसी भी regex जादूगरों के लिए लग रहा है?

अद्यतन: मैं rogeriopvl का जवाब बेहतर (+1) ... खासकर जब से मैं किसी भी अच्छा regex उपकरण अभी नहीं मिल सकता है की तरह है।

-1

आप .each() jquery फ़ंक्शन को देखना चाहते हैं, जो आपको चयनकर्ता के प्रत्येक तत्व के माध्यम से पुन: सक्रिय करने की अनुमति देता है, इस प्रकार आप प्रत्येक इनपुट फ़ील्ड को जांच सकते हैं और देख सकते हैं कि यह खाली है या नहीं और फिर निकालें element.remove() का उपयोग कर फ़ॉर्म से। इसके बाद आप फॉर्म को क्रमबद्ध कर सकते हैं।

+1

उस के साथ समस्या सिर्फ उपयोगकर्ता गायब होने के ठीक पहले पेज प्रस्तुत नियंत्रण से खाली देखेंगे। नाम को "" सेट करने के लिए बेहतर होगा ताकि धारावाहिक इसे अनदेखा कर सके। –

+0

@ 7 टाइम्स 9, हाँ आप सही हैं, मैं उस विवरण के बारे में भूल गया। – rogeriopvl

6

आप एक regex के साथ यह कर सकता है ...

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

टेस्ट मामलों:

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

। स्थान (/[^&]+=\.?(& | $)/g, '') दोनों मामलों को शामिल करता है। लेकिन मैं पीछे हटने के लिए .replace (/ & $ /, '') जोड़ दूंगा और –

+13

कोई समस्या नहीं है कि रेगेक्स खराब नहीं हो सकता है। –

0

coffeescript में, इस कार्य करें:

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

मैं समाधान ऊपर लेकिन उन मेरे लिए इस्तेमाल किया है काम नहीं किया।इसलिए मैं कोड

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

निम्नलिखित का इस्तेमाल किया है किसी

38

के लिए उपयोगी मैं (?) काम करने के लिए टॉम की समाधान प्राप्त करने में सक्षम नहीं था हो सकता है, लेकिन मैं एक छोटी समारोह के साथ इस .filter() का उपयोग कर ऐसा करने में सक्षम था खाली क्षेत्रों की पहचान करने के लिए। मैं jQuery 2.1.1 का उपयोग कर रहा हूँ।

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

काम के लिए अनुमोदित उत्तर नहीं मिला, लेकिन यह बहुत अच्छा काम किया! धन्यवाद! – bfritz

+0

क्या '