
本教程详细介绍了如何使用j*ascript的fetch api异步提交html表单数据。我们将探讨从传统formdata直接提交到更现代、更灵活的json格式提交,并重点讲解如何利用`async/await`语法简化异步代码、优化错误处理,以及如何正确地将表单数据转换为json格式并设置相应的http请求头,以确保与后端api的顺畅通信。
在现代Web开发中,异步提交表单数据是提升用户体验的关键。Fetch API是J*aScript中用于执行网络请求的强大工具,但正确地使用它来发送表单数据,特别是处理响应和错误,需要一些技巧。本文将指导您完成这一过程,从基础的表单数据收集到高级的异步控制流和数据格式化。
当用户在Web表单中输入信息并点击提交按钮时,我们通常希望在不刷新整个页面的情况下将数据发送到服务器。这可以通过监听表单的submit事件并阻止其默认行为来实现。
首先,获取表单元素并为其添加事件监听器:
const addBooking_form = document.getElementById("form_addResa");
addBooking_form.addEventListener("submit", (event) => {
// 阻止表单的默认提交行为,即页面刷新
event.preventDefault();
// 后续将在这里处理数据发送逻辑
});Fetch API可以接受多种类型的请求体,其中一种是FormData对象。FormData可以直接从HTML表单元素构建,它会自动收集所有具有name属性的输入字段的值。
// ...在event.preventDefault()之后...
const formData = new FormData(addBooking_form);
// 您可以通过以下方式查看FormData的内容(仅限开发工具)
// for (let pair of formData.entries()) {
// console.log(pair[0] + ': ' + pair[1]);
// }虽然FormData可以直接作为Fetch请求的body发送(默认Content-Type为multipart/form-data),但许多现代API更倾向于接收JSON格式的数据。
传统的Promise.then().then()链式调用在处理复杂的异步逻辑时可能会变得难以阅读和维护。async/await语法提供了一种更同步、更直观的方式来编写异步代码。
要使用async/await,您需要将事件监听器的回调函数标记为async:
火龙果写作
用火龙果,轻松写作,通过校对、改写、扩展等功能实现高质量内容生产。
277
查看详情
addBooking_form.addEventListener("submit", async (event) => { // 注意这里的 async 关键字
event.preventDefault();
// ... 异步逻辑 ...
});为了与大多数RESTful API更好地兼容,通常建议将表单数据转换为JSON对象,并通过Fetch发送。Object.fromEntries()方法可以方便地将FormData对象转换为普通的J*aScript对象。
addBooking_form.addEventListener("submit", async (event) => {
event.preventDefault();
// 使用 Object.fromEntries 将 FormData 转换为普通对象
const formDataObject = Object.fromEntries(new FormData(event.target));
// console.log(formDataObject); // 查看转换后的对象
// ... 后续发送请求 ...
});重要提示: event.target在这里直接引用了触发事件的表单元素,即addBooking_form,这是一种更简洁的写法。
当发送JSON数据时,您需要执行两个关键步骤:
同时,结合try...catch块来优雅地处理网络错误和服务器响应错误。
addBooking_form.addEventListener("submit", async (event) => {
event.preventDefault();
const formDataObject = Object.fromEntries(new FormData(event.target));
try {
const response = await fetch("api/booking/new", {
method: "POST",
headers: {
'Content-Type': 'application/json' // 明确指定请求体为JSON
},
body: JSON.stringify(formDataObject) // 将对象转换为JSON字符串
});
// 检查HTTP响应状态码
if (!response.ok) {
// 如果响应状态码不是2xx,抛出错误
const errorText = await response.text();
throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);
}
// 解析JSON响应数据
const data = await response.json();
console.log("预订成功:", data);
// 假设有一个元素用于显示结果
const table = document.getElementById("some_table_id"); // 替换为实际的元素ID
if (table) {
table.innerHTML = JSON.stringify(data, null, 2); // 美化JSON输出
}
} catch (error) {
console.er
ror("提交预订时发生错误:", error);
// 在UI上显示错误信息
alert(`提交失败: ${error.message || '未知错误'}`);
}
console.log('新预订提交流程完成');
});HTML表单示例: 为了确保FormData能够正确收集数据,您的HTML表单输入字段必须包含name属性。
<form id="form_addResa">
<div class="fieldset flexCol-around">
<label for="input_lieu">Lieu *</label>
<select id="input_lieu" name="place">
<option value="none">< Séléctionner un lieu ></option>
<option value="Salammbô">Salammbô</option>
<option value="Pergola">Pergola</option>
<option value="Salon Jaune">Salon Jaune</option>
<option value="1001 Bougies">1001 bougies</option>
</select>
<div class="flexRow-around">
<div class="flexCol-around">
<label for="input_date">Date *</label>
<input id="input_date" type="date" name="date">
</div>
<div class="flexCol-around">
<label for="input_time">Heure *</label>
<input id="input_time" type="time" name="time">
</div>
</div>
<label for="input_nom">Nom *</label>
<input id="input_nom" type="text" name="name">
<label for="input_prenom">Prénom *</label>
<input id="input_prenom" type="text" name="firstName">
</div>
<div class="fieldset flexCol-around">
<label for="input_couverts">Nombre de couverts *</label>
<input id="input_couverts" type="number" name="coverts">
<label for="input_intExt">Client interne / externe *</label>
<select name="intExt" id="input_intExt">
<option value="ext">Externe</option>
<option value="int">Interne</option>
</select>
<label for="input_contacte">Contacter le client *</label>
<input id="input_contacte" type="text" placeholder="Numéro de chambre / téléphone / E-mail" name="contact">
</div>
<div class="fieldset">
<textarea id="input_note" placeholder="Note :" name="notes"></textarea>
</div>
<div class="flexRow-around">
<input type="reset" value="Annuler" style="background: white;">
<input type="submit" value="提交">
</div>
</form>请注意,原HTML中的onclick="unselectBooking();"被移除,因为异步提交逻辑已经完全在submit事件监听器中处理。
通过本教程,您应该已经掌握了如何使用Fetch API和async/await语法异步提交表单数据。关键在于正确地将表单数据转换为服务器期望的格式(通常是JSON),设置正确的HTTP请求头,并利用try...catch块实现健壮的错误处理。这种方法不仅使代码更清晰、更易于维护,也为用户提供了更流畅的Web体验。
以上就是使用Fetch API提交表单数据并处理异步响应的教程的详细内容,更多请关注其它相关文章!
相关文章:
曝R星经典之作开发图 设计简陋但信息密集!
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
极兔快递快件信息查询系统 极兔快递官网运单号追踪
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
ArrayList与LinkedList核心操作的Big-O复杂度分析
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程
Animex动漫社网入口地址 Animex动漫社网正版在线入口
Python getattr() 异常处理深度解析:避免程序意外退出
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址
机器学习中对数变换预测结果的反向还原
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
怎么搭建一个php网站源码_搭php网站源码搭建教程
Lar*el Eloquent:基于关联关系是否存在进行父模型过滤与删除
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
大麦的“候补”是什么意思 大麦候补购票规则【详解】
QQ官网正版登录链接 QQ在线登录入口最新
J*aScript map 方法中处理循环元素为空数组的策略
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
Archive of Our Own官网直达 AO3最新可用地址一览
Win10双系统截图高效法 截屏快捷键速记【技巧】
网易大神账号申诉需要多久_网易大神账号申诉流程说明
Lar*el DB::listen 事件中的查询执行时间单位解析
2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享
Python异步编程实践:使用Binance API构建实时交易数据流
处理嵌套交互式控件:前端可访问性指南
Mac怎么锁定备忘录_Mac备忘录加密设置教程
J*a里如何使用forEach遍历Map_Map遍历方法说明
解决Tabulator日期时间排序问题的专业指南
深入理解与实现最大堆的Heapify过程:常见错误与修正
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
使用PHP从URL路径中提取倒数第二个片段
steam官方网页快速访问 steam账号注册全流程
在J*a中如何使用Stream.map转换元素_Stream映射操作解析
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
React Router 嵌套组件中 URL 重定向问题的解决方案
Excel文件在线转换快速入口 Excel在线格式转换网站
Golang如何实现状态模式管理对象状态_Golang State模式实现技巧
谷歌邮箱注册显示错误Gmail服务器异常与延迟处理
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
AO3镜像入口大全 AO3网页版内容访问全集
使用Python高效删除Word宏并转换DOCM为DOCX格式
Go语言中JSON数据解析与字段访问教程
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
在Google App Engine Go中实现独立模块代码库与灵活路由