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


107

我有一个包含许多文本输入和下拉列表的搜索表单,这些文本通过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

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

Answers:


167

我一直在寻找jQuery文档,我认为我们可以使用选择器在一行中做到这一点:

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

显然,#myForm获得的元素的ID为“ myForm”,但起初对我而言不太明显的是#myForm和:input之间需要空格字符,因为它是后代运算符。

:input匹配所有输入,文本区域,选择和按钮元素。

[value!='']是一个属性不等于过滤器。奇怪的是(有用的)事情是:所有:input元素类型都具有value属性,甚至select和checkbox等。

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

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

在这种情况下,并置(即,两个属性选择器彼此相邻放置)表示AND。使用逗号表示“或”。抱歉,如果这对CSS员工来说是显而易见的!


3
@Mvision,这是因为此答案有一个很小但很明显的遗漏。对于jQuery 1.8及更早版本中的普通/纯CSS选择器,请[value]匹配具有value present属性的任何元素,包括具有空值(或没有空值)的元素。这是由于早期jQuery版本中的一个错误导致在input[value]和的某些变体之间出现不一致:input[value]。举个例子来说,<input value="foo"><input value=""><input value><input>; 该小提琴中说明了错误。
2013年

4
对我来说,这可行:$form.find(":input[value]")-未选择空字段。这不起作用:$form.find(":input[value!='']")-选择了所有字段。希望能对某人有所帮助。(jQuery 2.0.0)
Ryan Wheale 2014年

1
$form.find(":input[value]")也为我工作(jQuery 1.11.0)
GSTAR

仅当value属性已经存在时才起作用。否则它无法识别。
starcorn

1
在某些情况下,value以编程方式进行设置将无法正常工作(value不会作为HTML属性存在,但会作为输入中的数据属性存在)。在这种情况下,试试这个:$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()。编辑:刚看到里奇的答案相同的效果。
法塔赫·哈尔萨

54

我无法获得Tom的解决方案(?),但是我可以通过.filter()使用简短函数来识别空字段来实现此目的。我正在使用jQuery 2.1.1。

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

2
无法获得批准的答案,但是效果很好!谢谢!
bfritz

回答我自己的问题:“ :input选择器基本上选择所有表单控件。选择所有输入,文本区域,选择和按钮元素。” 来源
Dinei '17

是的,汤姆的坏了。你的比我在那个小提琴中的尝试还干净。Up'd
Hashbrown

11

这对我有用:

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

好吧,回调使传递返回值的值为true,将所有内容!!重新输入为bool,您可以在控制台中尝试。!!('test')!!(5)!!(0)
Aiphee

2
并且代替input选择器,应该有:input包括选择等
Aiphee

我建议更改:data = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Mahoor13

9

您可以使用正则表达式...

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

.replace(/[^&]+=\.?(& | $)/ g,'')涵盖了两种情况。但我要添加.replace(/&$ /,'')以删除结尾的&
Tom Viner 2009年

15
正则表达式不会使问题变得更糟。
Michael Cook

3

我已经使用了上述解决方案,但是对我来说这些没有用。所以我用下面的代码

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

可能对某人有用


1

我将看一下jQuery的源代码。在最新版本的第3287行中。

我可能会添加“ serialize2”和“ serializeArray2”函数。当然给他们起一个有意义的名字。

或更好的方法是编写一些东西以将未使用的var从serializedFormStr中拉出。一些正则表达式在中间字符串中查找=&或以=结尾,附近是否存在任何正则表达式向导?

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


1

Rich解决方案的替代方案

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

说明:

  • .submit()钩住表单的submit事件
  • e.preventDefault() 阻止表单提交
  • .serializeArray() 为我们提供了将要发送的查询字符串的数组表示形式。
  • .filter() 删除该数组中的虚假(包括空)值。
  • $.param(query) 创建更新后的数组的序列化且符合URL的表示形式
  • 设置一个值以window.location.href发送请求

0

在coffeescript中,执行以下操作:

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

-1

您可能想看一下.each()jQuery函数,该函数允许您遍历选择器的每个元素,因此您可以通过这种方式检查每个输入字段,查看是否为空,然后将其从表单中删除。使用element.remove()。之后,您可以序列化表格。


1
唯一的问题是,在页面提交之前,用户将看到控件中的空白消失。将名称设置为“”会更好,因此序列化会忽略它。
Tom Viner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.