当 POST 到 iframe (Firefox 37.0.2) 时,location.reload 阻止表单提交
location.reload prevents form submit when POST to iframe (Firefox 37.0.2)
Firefox 版本为 37.0.2
我有一个 MVC 应用程序,我在其中提交表单以执行 CRUD 功能。我POST给一个隐藏的iframe,然后在POST之后刷新页面,这样用户就可以看到数据库更新后的新数据了。这是负责添加新用户的 javascript 函数:
$('#submitNewUser').click(function () {
document.getElementById("newUser").submit();
$('#newUser').remove();
location.reload();
}
submitNewUser
是提交表单的按钮(id和name)。 newUser
是提交的模态表单的名称和id。因此,在单击 submitNewUser
按钮时,会提交 newUser
表单,然后删除 newUser
模态 window,然后重新加载页面。
此功能在 Chrome 和 IE 中按预期(或至少按我的预期)工作。在 Firefox 中,页面会在不提交表单的情况下重新加载。控制台中没有错误,看起来只是发生了页面刷新。当我注释掉行:location.reload();
时,表单已提交,但我必须手动刷新页面才能看到数据更改。
我搜索过类似的问题,但到目前为止无法解决问题。我尝试过的事情:
- 将 iframe 的
name
参数更改为 NAME
- 从 iframe 的名称和 ID 参数中删除所有大写字母
- 使用
window.location = window.location
代替 location.reload()
- 我将输入类型从
button
更改为 submit
并将 javascript 函数修改为表单的 onSubmit
,但行为与我的相同最初报告的问题
我从表单中删除了 target
参数,然后从 javascript 中删除了 location.reload()
行。然后,所有浏览器的行为都是相同的:表单被提交,页面被重定向到我的 "Success!" 页面。这告诉我 location.reload()
发生了一些事情,以及它如何与 Firefox 中的 iframe 交互。这是我的 iframe 代码:
<iframe id="new_user_hidden_frame" name="new_user_hidden_frame" class="hide"></iframe>
这里是我为 POST 方法设置目标的地方:
<form id="newUser" method="POST" action='<c:url value="/createUser.htm" />' target="new_user_hidden_frame">
编辑:
根据公认的答案,Firefox 实际上是唯一在技术上正确处理此问题的浏览器!我在收到回复之前正在刷新页面,所以这个行为是 100% 合适的。我将以下内容添加到我的函数中,以便在收到响应之前页面不会刷新:
$.ajax({
success: function() {
window.location.reload(true);
}
});
正如您的代码所说,您正在尝试在获得响应之前重新加载页面,因此请求直到完成,为此您必须延迟重新加载或使用 ajax 提交表单并重新加载页面的更好方法回调函数。
Firefox 版本为 37.0.2
我有一个 MVC 应用程序,我在其中提交表单以执行 CRUD 功能。我POST给一个隐藏的iframe,然后在POST之后刷新页面,这样用户就可以看到数据库更新后的新数据了。这是负责添加新用户的 javascript 函数:
$('#submitNewUser').click(function () {
document.getElementById("newUser").submit();
$('#newUser').remove();
location.reload();
}
submitNewUser
是提交表单的按钮(id和name)。 newUser
是提交的模态表单的名称和id。因此,在单击 submitNewUser
按钮时,会提交 newUser
表单,然后删除 newUser
模态 window,然后重新加载页面。
此功能在 Chrome 和 IE 中按预期(或至少按我的预期)工作。在 Firefox 中,页面会在不提交表单的情况下重新加载。控制台中没有错误,看起来只是发生了页面刷新。当我注释掉行:location.reload();
时,表单已提交,但我必须手动刷新页面才能看到数据更改。
我搜索过类似的问题,但到目前为止无法解决问题。我尝试过的事情:
- 将 iframe 的
name
参数更改为NAME
- 从 iframe 的名称和 ID 参数中删除所有大写字母
- 使用
window.location = window.location
代替location.reload()
- 我将输入类型从
button
更改为submit
并将 javascript 函数修改为表单的onSubmit
,但行为与我的相同最初报告的问题 我从表单中删除了
target
参数,然后从 javascript 中删除了location.reload()
行。然后,所有浏览器的行为都是相同的:表单被提交,页面被重定向到我的 "Success!" 页面。这告诉我location.reload()
发生了一些事情,以及它如何与 Firefox 中的 iframe 交互。这是我的 iframe 代码:<iframe id="new_user_hidden_frame" name="new_user_hidden_frame" class="hide"></iframe>
这里是我为 POST 方法设置目标的地方:
<form id="newUser" method="POST" action='<c:url value="/createUser.htm" />' target="new_user_hidden_frame">
编辑: 根据公认的答案,Firefox 实际上是唯一在技术上正确处理此问题的浏览器!我在收到回复之前正在刷新页面,所以这个行为是 100% 合适的。我将以下内容添加到我的函数中,以便在收到响应之前页面不会刷新:
$.ajax({
success: function() {
window.location.reload(true);
}
});
正如您的代码所说,您正在尝试在获得响应之前重新加载页面,因此请求直到完成,为此您必须延迟重新加载或使用 ajax 提交表单并重新加载页面的更好方法回调函数。