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

Tom*_*ner 104 javascript forms jquery serialization input

我有一个搜索表单,其中包含许多通过GET提交的文本输入和下拉菜单.我想通过在执行搜索时从查询字符串中删除空字段来获得更清晰的搜索URL.

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

知道如何使用jQuery做到这一点?

Tom*_*ner 165

我一直在查看jQuery文档,我认为我们可以使用选择器在一行中执行此操作:

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

很明显,#myForm获取了id为"myForm"的元素,但最初对我来说不太明显的是#myForm和:input之间需要空格字符,因为它是后代运算符.

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

[value!='']是一个不等于过滤器的属性.奇怪的(也是有用的)是 all:input元素类型具有值属性,甚至是选择和复选框等.

最后还删除值为'.'的输入.(如问题中所述):

$("#myForm :input[value!=''][value!='.']").serialize()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,并置,即将两个属性选择器彼此相邻放置,意味着AND.使用逗号表示OR.对不起,如果那对CSS人来说很明显!

  • [value]在jquery 1.7.2中对我不起作用,[value!='']没有 (6认同)
  • 对我来说,这个工作:`$ form.find(":input [value]")` - 没有选择空字段.这不起作用:`$ form.find(":input [value!='']")` - 所有字段都被选中.希望能帮助别人.(jQuery 2.0.0) (4认同)
  • @Mvision,这是因为在这个答案中有一个小但重要的遗漏.对于jQuery 1.8及更早版本中的普通/纯CSS选择器,`[value]`匹配任何具有属性`value`*present*,**的元素,包括**那些具有空值(或没有)值的元素.这是由于早期jQuery版本中的一个错误导致`input [value]`和`:input [value]`的某些变体之间的不一致.举例来说,`<input value ="foo"> <input value =""> <input value> <input>`; 这个错误在[this fiddle](http://jsfiddle.net/cxUux/)中有说明. (3认同)
  • 在某些情况下,以编程方式设置“value”,这将不起作用(“value”不会作为 HTML 属性存在,但会作为输入上的数据属性存在)。在这些情况下,请尝试以下操作:`$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()`。编辑:刚刚看到里奇的回答,效果相同。 (3认同)
  • `$form.find(":input[value]")` 也对我有用(jQuery 1.11.0) (2认同)

Ric*_*ich 51

我无法让Tom的解决方案工作(?),但我能够使用.filter()短函数来识别空字段.我正在使用jQuery 2.1.1.

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

  • 无法获得批准的工作答案,但这很有效!谢谢! (2认同)

RMa*_*tov 11

这对我有用:

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

  • 而不是`input`选择器,应该有`:input`来包含选择等。 (2认同)

nic*_*ckf 8

你可以用正则表达式来做...

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

测试用例:

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
Run Code Online (Sandbox Code Playgroud)

  • 正则表达式不会变得更糟,这是没有问题的. (15认同)