使用 FormData api 提交部分表单数据

partial form data submission with FormData api

使用 Ajax 可以发送表单的部分数据,使用下面的数据作为 ajax-

的数据
$("#CreateForm").find("#form-section-1").find('input, textarea, select').serialize()

对 FormData 进行同样的尝试 api -

new FormData($('form#CreateForm')[0])

但这不起作用 -

var formdata = new FormData($('form#CreateForm').find("#form-section-1").find('input, textarea, select'))

因为下面的循环没有给出结果 -

for (var pair of formdata.entries()) {
    console.log(pair[0]+ ', ' + pair[1]); 
}

如何使用 FormData api 以类似序列化的紧凑形式提交部分表单数据?

编辑: 在已接受的解决方案中,我必须进一步为文件添加此条件,尤其是 -

if($(this).is(':input:file')) { 
formData.append(this.name, $(this)[0].files[0]); 
} else { 
formData.append(this.name, $(this).val()); 
}

FormData constructor 接受可选的本机 <form/> 元素参数以传递表单中的所有数据。注意,

$('form#CreateForm') // jQuery object
$('form#CreateForm')[0] // native form element
$('form#CreateForm #form-section-1').find('input, textarea, select') // jQuery objects
$('form#CreateForm #form-section-1').find('input, textarea, select')[0] // some native non-form element 

所以你不能真正使用构造函数。

FormData 对象确实有一个 .append method 可以将新值添加到对象中。你可以用它来做

var formData = new FormData();
$('form#CreateForm #form-section-1').find('input, textarea, select').each(function () {
        if($(this).is(':input:file')) {
            formData.append(this.name, $(this)[0].files[0]);
        } else {
            formData.append(this.name, $(this).val());
        }
});

仅供参考 :input 是 shorthand 对于 input|select|textarea|button