我如何使用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。