我正在使用 jquery$.ajax();
函数来发布表单的数据,以获取我正在使用的表单的数据,new FormData
因为在我的表单中也有一个输入文件。
问题是我在我的表单中也禁用了字段,这些字段通常不会发布,但如果我使用新FormData
的,它们就是。
如何解决这个问题呢?我不需要发布禁用的输入字段!
我正在使用 jquery$.ajax();
函数来发布表单的数据,以获取我正在使用的表单的数据,new FormData
因为在我的表单中也有一个输入文件。
问题是我在我的表单中也禁用了字段,这些字段通常不会发布,但如果我使用新FormData
的,它们就是。
如何解决这个问题呢?我不需要发布禁用的输入字段!
如何FormData
仅使用您想要的字段构建:
// New FormData, get form and inputs
var payload = new FormData(),
$form = $("form")
$inputs = $("input", $form);
// For each input
for (var i = 0, l = $inputs.length; i < l; i++) {
// Cache jQuery selector for input and get disabled attr
var $input = $(inputs[i]),
disabled_attr = $input.attr("disabled");
// If the disabled attr is undefined or false
// see http://stackoverflow.com/questions/1318076/jquery-hasattr-checking-to-see-if-there-is-an-attribute-on-an-element
if (disabled_attr === "undefined" || disabled_attr === false) {
// Append the key value pair to the FormData
payload.append($input.attr("name"), $input.attr("value"));
}
}
您现在应该可以使用data
on提交 FormData $.ajax
。如果失败,您可以使用 vanilla JavaScript 提交它:
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.send(payload);
我对新的 FormData 了解不多,但这里有一个替代解决方案。如果您的表单不包含太多字段,请使用$.ajax() 调用的data属性并将所需字段及其值仅发送到服务器。示例语法如下
$.ajax({
type: "POST" OR "GET",
url: "/someUrl",
data:
{
'id' : $('#empId').val(),
'name' : $('$empName').val()
} ,
dataType: "json",
success: function(result){
alert(result);
}});
问题是我在我的表单中也禁用了字段,这些字段通常不会发布,但如果我使用
new FormData
它们。
根据XHR和HTML5,它们确实不能被序列化。您应该针对那些这样做的浏览器提交错误。
如何解决这个问题呢?我不需要发布禁用的输入字段!
我只是不需要它们,等待修复。如果您要求省略它们,您可以尝试以下解决方法:
var $form = /* whatever you have */;
var $inputs = $form.find(":disabled").each(function() {
$(this).data("xhr-name", this.name);
this.name = ""; // fields with empty names must be ignored as well
});
var formdata = new FormData($form[0]);
$inputs.each(function() {
this.name = $(this).data("xhr-name");
});
如果这都不起作用,您可以 a) 完全从 DOM 中分离输入并稍后恢复它们,或者 b)FormData
手动构建。