在submit事件中获取FormData并转为JSON,需先阻止默认提交,再用new FormData(form)创建实例,遍历entries()构造键值对象(同名字段合并为数组),最后JSON.stringify发送;含文件时应直接提交FormData而非转JSON。

在 submit 事件中获取 FormData 并转为 JSON,关键在于:阻止默认提交、从表单创建 FormData、再遍历它构造普通对象(因为 FormData 本身不能直接 JSON.stringify)。
1. 在 submit 事件中正确获取 FormData
必须用 event.preventDefault() 阻止页面跳转或刷新,然后用 new FormData(formElement) 创建实例:
document.querySelector('form').addEventListener('submit', function(e) {
e.preventDefault(); // ⚠️ 必须加,否则页面会提交并刷新
const formData = new FormData(e.target); // e.target 就是当前 form 元素
// 后续处理...
});
2. 将 FormData 转为标准 JavaScript 对象
FormData 是键值对集合,但不支持直接展开或 JSON 序列化。需手动遍历,注意:同名多值(如复选框)要合并为数组:
- 用
for...of遍历formData.entries() - 遇到重复 key,把值存入数组;首次出现则设为单值
- 可选:过滤空值或做类型转换(如数字、布尔)
示例代码:
function formDataToJSON(formData) {
const json = {};
for (const [key, value] of formData.entries()) {
if (json[key] === undefined) {
json[key] = value;
} else if (Array.isArray(json[key])) {
json[key].push(value);
} else {
json[key] = [json[key], value];
}
}
return json;
}
// 使用
const json = formDataToJSON(formData);
console.log(json); // { username: "alice", hobbies: ["reading", "coding"] }
3. 发送 JSON 数据(例如用 fetch)
得到 JSON 对象后,可直接用于 fetch 请求体。注意设置 Content-Type: application/json:
fetch('/api/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(json) // ✅ 此时才能安全 stringify
});
4. 补充说明:兼容性与注意事项
注意:部分老浏览器不支持 FormData.entries(),可用 formData.get(key) + 手动枚举字段替代;现代项目基本无需担心。
如果表单含文件(),FormData 会自动包含文件对象,但转成 JSON 时文件无法序列化——此时应保持用 FormData 直接发送(不转 JSON),或先上传文件再提交其余字段。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











