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

IT技术 javascript jquery forms serialization input
2021-01-29 04:50:30

我有一个搜索表单,其中包含一些通过 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 做到这一点吗?

6个回答

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

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

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

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

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

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

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

在这种情况下,并列,即将两个属性选择器并排放置,意味着 AND。使用逗号意味着 OR。对不起,如果这对 CSS 人员来说很明显!

仅当该value属性已经存在时才有效否则它不承认它。
2021-03-21 04:50:30
在某些以value编程方式设置的情况下,这将不起作用(value不会作为 HTML 属性存在,但会作为输入的数据属性)。在这种情况下,试试这个:$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()编辑:刚刚看到 Rich 对相同效果的回答。
2021-03-25 04:50:30
对我来说,这有效:$form.find(":input[value]")- 未选择空字段。这不起作用:$form.find(":input[value!='']")- 选择了所有字段。希望能帮助某人。(jQuery 2.0.0)
2021-03-31 04:50:30
@Mvision,那是因为这个答案中有一个很小但很重要的遗漏。对于 jQuery 1.8 及更早版本中的普通/纯 CSS 选择器,[value]匹配任何具有value present属性的元素包括那些具有空值(或没有)值的元素这是由于在创建中的某种变化之间的不一致早期的jQuery版本的bug,input[value]:input[value]举个例子来说,<input value="foo"><input value=""><input value><input>; 这个错误在这个小提琴中得到了说明
2021-04-06 04:50:30
$form.find(":input[value]") 也对我有用(jQuery 1.11.0)
2021-04-14 04:50:30

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

var formData = $("#formid :input")
    .filter(function(index, element) {
        return $(element).val() != '';
    })
    .serialize();
是的,汤姆的坏了你的也比我在那个小提琴上的尝试更干净。向上
2021-03-16 04:50:30
回答我自己的问题:“:input选择器基本上选择所有表单控件。选择所有输入、文本区域、选择和按钮元素。” 来源
2021-03-22 04:50:30
无法获得批准的答案,但效果很好!谢谢!
2021-04-04 04:50:30

你可以用正则表达式来做到这一点......

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
正则表达式不会变得更糟,这没有问题。
2021-03-19 04:50:30
.replace(/[^&]+=\.?(&|$)/g, '') 涵盖这两种情况。但我会添加 .replace(/&$/, '') 来删除尾随 &
2021-04-03 04:50:30

这对我有用:

data = $( "#my_form input").filter(function () {
        return !!this.value;
    }).serialize();
我建议这个改变: data = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
2021-04-02 04:50:30
而不是input选择器,应该:input包括选择等。
2021-04-05 04:50:30
好吧,回调是让传递值返回 true,将!!任何内容重新键入为 bool,您可以在控制台中尝试。!!('test'), !!(5),!!(0)
2021-04-13 04:50:30

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

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

可能对某人有用