我如何使用jQuery的form.serialize但排除空字段

我有一个search表单与一些文本input和下拉通过提交GET。 我希望有一个更干净的searchurl,通过删除查询string中的空字段执行search时。

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

任何想法如何使用jQuery做到这一点?

我一直在查看jQuery文档 ,我想我们可以使用select器在一行中完成:

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

很明显,#myForm获取id为“myForm”的元素,但是最初对我来说不太明显的是#myForm和:input之间需要空格字符 ,因为它是后代操作符。

:input匹配所有input,textarea,select和button元素。

[value!='']是一个不等于filter的属性。 奇怪的(也是有用的)是所有:input元素types都具有值属性,甚至select和checkbox等。

最后还要删除值为“。”的input。 (如问题所述):

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

在这种情况下,并置( 即将两个属性select器并排放置)意味着AND。 使用逗号意味着一个OR。 对不起,如果这是明显的CSS人!

我无法让Tom的解决scheme工作(?),但是我可以使用.filter()和一个简短的函数来识别空字段。 我正在使用jQuery 2.1.1。

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

我不知道为什么,但对我来说,只有这个解决scheme:

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

你可以用正则expression式来做…

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

testing用例:

 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 

我会看看jQuery的源代码。 在最新版本的3287行。

我可能会添加一个“serialize2”和“serializeArray2”函数。 当然要命名他们的东西是有意义的。

或者更好的方法是写一些东西,将未使用的variables从serializedFormStr中取出。 一些正则expression式=中间string或结束=任何正则expression式向导?

更新:我更喜欢rogeriopvl的答案(+1)…特别是因为我现在找不到任何好的正则expression式工具。

我已经使用了上述解决scheme,但对我来说那些没有工作。 所以我用了下面的代码

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

可能对某人有用

在coffeescript,这样做:

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

你可能想看看.each()jquery函数,它允许你遍历select器的每个元素,这样你可以去检查每个input字段,看看它是否是空的,然后从表单中删除它使用element.remove()。 之后,你可以序列化的forms。