在此表单中,用户可以为作者(音乐,歌词作者)添加一些信息
用户可以选择添加1个或更多作者。
问题是,当用户只输入1位作者时,所有其他输入仍然为空,但jQuery序列化函数会将它们放在URL中,服务器会给我这个错误:
Request-URI Too Large
见下面的例子:
echo "<form action=\"\" id=\"submForm\" name=\"submForm\" method=\"get\">";
// AUTHOR NUMBER 1
echo "<p><span class=\"labelInput\">".(_t('_cR_name'))." </span><input id=\"nameAuthor\" name=\"author[0][name]\" value=\"\" type=\"text\" class=\"commonInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOB'))." </span><input id=\"DOBAuthor\" name=\"author[0][DOB]\" value=\"\" type=\"text\" class=\"littleInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOD'))." </span><input id=\"DODAuthor\" name=\"author[0][DOD]\" value=\"\" type=\"text\" class=\"littleInput\"></p>";
// AUTHOR NUMBER 2
echo "<p><span class=\"labelInput\">".(_t('_cR_name'))." </span><input id=\"nameAuthor\" name=\"author[1][name]\" value=\"\" type=\"text\" class=\"commonInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOB'))." </span><input id=\"DOBAuthor\" name=\"author[1][DOB]\" value=\"\" type=\"text\" class=\"littleInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOD'))." </span><input id=\"DODAuthor\" name=\"author[1][DOD]\" value=\"\" type=\"text\" class=\"littleInput\"></p>"; Death:
// AUTHOR NUMBER 3
echo "<p><span class=\"labelInput\">".(_t('_cR_name'))." </span><input id=\"nameAuthor\" name=\"author[2][name]\" value=\"\" type=\"text\" class=\"commonInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOB'))." </span><input id=\"DOBAuthor\" name=\"author[2][DOB]\" value=\"\" type=\"text\" class=\"littleInput\"></p>";
echo "<p><span class=\"labelInput\">".(_t('_cR_DOD'))." </span><input id=\"DODAuthor\" name=\"author[2][DOD]\" value=\"\" type=\"text\" class=\"littleInput\"></p>";
echo "</form>";
这是jQuery代码(它还包含一个验证函数,我在jQuery 1.3.2上)
echo "<script type=\"text/javascript\">
$(document).ready(function() {
$('#submForm').validate({
submitHandler: function(form) {
var serialized = $('#submForm').serialize()
$.get('".$site['url']."modules/yobilab/copyright/classes/DO_submission.php', serialized);
window.setTimeout('location.reload()', 8000);
return false;
form.submit();
}
})
});
现在假设用户只输入AUTHOR 1的字段,并将AUTHOR 2和AUTHOR 3留空。我怎么说jQuery序列化函数只包含在URL中的输入字段,并且根本不包括空字段?
答案 0 :(得分:12)
我刚遇到同样的问题,但形式却截然不同。 我不喜欢这里的几个答案如何删除表单元素,您可以在表单提交之前看到页面上删除的元素。 其他人克隆了表格,其中一个表格没有为我返回任何结果。
所以我最终得到了这个:
$('#submForm').find('input').not('[value=""]').serialize();
就我而言,上面的代码适用于我选择的菜单以及输入字段。
这正是我使用的:
$('#search').find('input, select').not('[value=""], [value="0"], [value="DESC"]').serialize();
因此它只提取具有数据而不是任何默认值的表单字段。 我很想知道这是否可以进一步优化。
答案 1 :(得分:8)
我正在使用的是什么
$("form").serialize().replace(/[^&]+=&/g, '').replace(/&[^&]+=$/g, '')
答案 2 :(得分:5)
您可以使用过滤器以及可以在任何jQuery对象上调用序列化的事实(此示例仅用于显示您只能序列化非空元素并且仅包含来自的<input>
元素形式):
var serialized = $('#submForm').filter(function(){
return $(this).val();
}).serialize();
这是一个working example - 将一个或多个文本框留空并单击按钮;您将看到序列化字符串更改为仅包含非空文本框。
答案 3 :(得分:4)
由于value
属性包含默认值,而不是实际值,我考虑使用它:
var queryString = $('form input').map(function () {
return $(this).val().trim() == "" ? null : this;
}).serialize();
优点:
答案 4 :(得分:1)
尝试添加此
$('input', '#submForm').each(function(){
$(this).val() == "" && $(this).remove();
})
OR
$('input:text[value=""]', '#submForm').remove();
前
var serialized = $('#submForm').serialize()
答案 5 :(得分:0)
首先检查字段是否为空。这些成功的推动阵列。您可以序列化元素数组。
答案 6 :(得分:0)
这应该适用于你想要做的事情:
$(document).ready(function() {
$('#submForm').validate({
submitHandler: function(form) {
// Do cleanup first
$('#submForm>input').each(function(){
if($(this).val() == "") { $(this).remove(); }
});
var serialized = $('#submForm').serialize();
$.get('".$site['url']."modules/yobilab/copyright/classes/DO_submission.php', serialized);
window.setTimeout('location.reload()', 8000);
return false;
form.submit();
}
})
});
修改... 强>
我真的认为Mark Koopman的解决方案是最简单的选择。你有什么理由不能使用POST代替GET吗?
编辑2 ...
哎呀,我完全错过了amit_g发布了同样的解决方案。但我希望至少在上下文中看到它仍然有用。
答案 7 :(得分:0)
我只需要做同样的事情,所以我写了一个小插件,只是在序列化之前禁用空输入:
(function($) {
$.fn.serialize_without_blank = function () {
var $form = this,
result,
$disabled = $([]);
$form.find(':input').each(function () {
var $this = $(this);
if ($.trim($this.val()) === '' && !$this.is(':disabled')) {
$disabled.add($this);
$this.attr('disabled', true);
}
});
result = $form.serialize();
$disabled.removeAttr('disabled');
return result;
};
}(jQuery));
像这样使用:
$.ajax({
url: $form.attr('action'),
type: $form.attr('method'),
data: $form.serialize_without_blank();
});
答案 8 :(得分:0)
Dr.Molle解决方案有效但如果缺少value属性,那么这就是解决方案: -
$(form).clone().find("input").each(function() {
if ($.trim($(this).val()) === '') {
$(this).remove();
}
}).end().serialize();
答案 9 :(得分:0)
var serializedData = $('.register-form').serializeArray();
var clear = {};
$.each(serializedData , function(i,data) {
if(data.value!=='' && clear[data.name]==undefined) clear[i] = data;
});
答案 10 :(得分:0)
这就是我做的事情
var form = $('form');
var form_input = form.serialize().replace(/[^=&]+=(&|$)/g,"").replace(/&$/,"");