利用iframe标签解决form的action执行网络接口时获取不到返回数据的问题

文章讲述了在利用HTML表单input自动检测功能时遇到的问题,即form的action提交网络接口无法接收返回值。解决方案是使用iframe绑定表单,并通过setTimeout处理异步获取iframe返回内容,以便在Vue中处理服务端响应。

问题说明: 若要利用input的自动检测功能(例如required=“required”、type=“email”),则必须利用form的action执行网络接口,且提交方式为type=“submit”,但是action执行网络接口无法接受返回值, 导致无法接收如登录注册功能服务端响应的结果。若舍弃input的自动表单验证,手写每个表单的验证很麻烦,因此要解决利用form提交表单数据无法接收返回数据的问题

解决方法: 利用iframe标签将form绑定,返回值将返回位在iframe上的页面,再获取页面中body的内容,即返回数据。

步骤与代码

  1. 利用iframe标签将form绑定,iframe标签的id要与form标签的target的值相同
<form class="input-form" method="post" action="user/userSignIn" target="signInIframe">
<iframe name="signInIframe" id="signInIframe" style="display: none"></iframe>
  1. 若不想利用iframe直接显示返回结果,则利用js获取iframe的body的内容,将获取的内容赋值给一个vue创建的变量,则可对返回值进行其他处理
setSignInMsg()  //获取iframe中body的内容
{
    var iframe = document.getElementById("signInIframe")
    var iframeDocument = iframe.contentDocument
    var iframeBody = iframeDocument.body
    this.otherMsg = iframeBody.innerHTML;  //otherMsg 为自己定义的其他变量
}

强调: 这个过程很有可能发生由于异步导致第一次获取不到iframe的内容,因此可以setTimeout处理。

setTimeout(() => {
    // 对变量进行其他处理
}, 1200);
setTimeout(() => {
    // 获取iframe的body的内容,并赋值给vue创建的变量
}, 500);
提交表单,如果希望阻止跳转到 `action` 页面,可以通过以下几种方式实现: ### 使用 JavaScript 阻止默认提交行为 默认情况下,表单提交会触发页面跳转,但可以通过 JavaScript 拦截表单提交事件,并阻止默认行为[^1]。例如: ```html <form id="myForm"> <input type="text" name="username" /> <button type="submit">提交</button> </form> <script> document.getElementById('myForm').addEventListener('submit', function (e) { e.preventDefault(); // 阻止默认提交行为 // 可以在这里通过 AJAX 提交数据 const formData = new FormData(this); fetch(this.action, { method: this.method, body: formData }); }); </script> ``` 上述代码中,`e.preventDefault()` 用于阻止浏览器的默认提交行为,从而防止页面跳转。表单数据可以通过 `fetch` 或 `XMLHttpRequest` 发送到服务器[^1]。 ### 使用 AJAX 提交表单数据 AJAX 是实现无刷新提交的关键技术。通过将表单数据异步发送到服务器,可以避免页面刷新和跳转[^1]。例如: ```html <form id="myForm" action="/submit" method="POST"> <input type="text" name="username" /> <button type="submit">提交</button> </form> <script> document.getElementById('myForm').addEventListener('submit', function (e) { e.preventDefault(); const formData = new FormData(this); fetch(this.action, { method: this.method, body: formData }).then(response => { // 处理服务器返回的响应 console.log('提交成功'); }); }); </script> ``` 该方法允许开发者在不离开当前页面的情况下完成数据提交,并根据服务器响应更新页面内容[^1]。 ### 使用 `target` 属性提交到隐藏的 iframe 另一种方式是通过 `target` 属性将表单提交到一个隐藏的 `<iframe>` 中,从而避免页面跳转[^1]。例如: ```html <form action="/submit" method="POST" target="hiddenFrame"> <input type="text" name="username" /> <button type="submit">提交</button> </form> <iframe name="hiddenFrame" style="display:none;"></iframe> ``` 在这种方式下,表单提交后会在隐藏的 iframe 中加载响应内容,而不会影响当前页面的显示[^1]。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值