当用户访问我的网站时,每个页面上都有一个“登录”链接。单击此按钮可使用一些JavaScript显示覆盖窗口,提示用户提供其凭据。输入这些凭证后,将对Web服务器进行Ajax调用以验证它们;如果它们有效,则会发回验证票证cookie并重新加载页面,以便显示特定于已验证用户或(现在)当前登录用户的页面上的任何内容。
我正在使用以下命令完成页面重新加载:
window.location.reload();
这非常适用于通过GET请求(绝大多数)加载的页面,但有些页面使用回发表单。因此,如果用户转到其中一个页面,执行回发,然后选择登录,则当window.location.reload()
脚本运行时,会出现提示他们是否要重新提交POST正文的对话框。
我想绕过这个我可以告诉浏览器重新加载页面,所以我尝试了:
window.location.href = window.location.href;
但是浏览器不对上述语句采取任何行动,我认为是因为它认为新的URL与旧的相同。如果我将上述内容更改为:
window.location.href = window.location.pathname;
重新加载页面,但我丢失了任何查询字符串参数。
我当前的解决方法已经足够,但不是很好 - 简而言之,我将查询字符串参数添加到当前window.location.href
值,然后通过调用window.location.href
将其分配回reloadPage("justLoggedIn")
, reloadPage
函数的位置是:
function reloadPage(querystringTackon) {
var currentUrl = window.location.href;
if (querystringTackon != null && querystringTackon.length > 0 && currentUrl.indexOf(querystringTackon) < 0) {
if (currentUrl.indexOf("?") < 0)
currentUrl += "?" + querystringTackon;
else
currentUrl += "&" + querystringTackon;
}
window.location.href = currentUrl;
}
这样可行,但会导致网址为www.example.com/SomeFolder/SomePage.aspx?justLoggedIn
,这似乎很俗气。
在JavaScript中是否有办法让它进行GET重新加载而不提示用户重新提交POST数据?我需要确保任何现有的查询字符串参数都不会丢失。
答案 0 :(得分:40)
window.location.href = window.location.href;
不要问我为什么会这样......但它确实:)。就像js引擎解释我想的逻辑一样。
答案 1 :(得分:8)
您可能需要做的是在运行POST / Form Handler脚本后重定向用户。
在PHP中,这样就完成了......
<?php
// ... Handle $_POST data, maybe insert it into a database.
// Ok, $_POST data has been handled, redirect the user
header('Location:success.php');
die();
?>
...此应该允许您刷新页面而不会收到“再次发送数据”警告。
您甚至可以重定向到同一页面(如果这是您要发布的内容),因为POST变量不会在标题中发送(因此不会在刷新时重新发布)
答案 2 :(得分:7)
这也有效:
window.location.href = window.location.pathname + window.location.search
答案 3 :(得分:4)
使用
RefreshForm.submit();
而不是
document.location.reload(true);
答案 4 :(得分:3)
这也可以通过POST / REDIRECT / GET模式解决
哪个更优雅:
How do I reload a page without a POSTDATA warning in Javascript?
答案 5 :(得分:3)
我和你有同样的问题。
这就是我所做的(动态生成的GET表单,操作设置为location.href,隐藏输入为新值),它似乎适用于所有浏览器:
var elForm=document.createElement("form");
elForm.setAttribute("method", "get");
elForm.setAttribute("action", window.location.href);
var elInputHidden=document.createElement("input");
elInputHidden.setAttribute("type", "hidden");
elInputHidden.setAttribute("name", "r");
elInputHidden.setAttribute("value", new Date().getTime());
elForm.appendChild(elInputHidden);
if(window.location.href.indexOf("?")>=0)
{
var _arrNameValue;
var strRequestVars=window.location.href.substr(window.location.href.indexOf("?")+1);
var _arrRequestVariablePairs=strRequestVars.split("&");
for(var i=0; i<_arrRequestVariablePairs.length; i++)
{
_arrNameValue=_arrRequestVariablePairs[i].split("=");
elInputHidden=document.createElement("input");
elInputHidden.setAttribute("type", "hidden");
elInputHidden.setAttribute("name", decodeURIComponent(_arrNameValue.shift()));
elInputHidden.setAttribute("value", decodeURIComponent(_arrNameValue.join("=")));
elForm.appendChild(elInputHidden);
}
}
document.body.appendChild(elForm);
elForm.submit();
答案 6 :(得分:3)
这对我有用。
window.location = window.location.pathname;
经过测试
答案 7 :(得分:2)
这是一篇较旧的帖子,但我确实有更好的解决方案。创建一个包含所有帖子值作为隐藏字段的表单,并为表单指定一个名称,如:
<form name="RefreshForm" method="post" action="http://yoursite/yourscript">
<input type="hidden" name="postVariable" value="PostData">
</form>
然后,您需要在setTimeout
RefreshForm.submit();
干杯!
答案 8 :(得分:1)
您可以尝试创建一个空表单,method = get,然后提交它。
<form id='reloader' method='get' action="enter url here"> </form>
<script>
// to reload the page, try
document.getElementById('reloader').submit();
</script>
答案 9 :(得分:1)
如果您的网址中有“#”哈希值,则此处的所有解决方案都不起作用。这是唯一对我有用的解决方案。
var hrefa = window.location.href.split("#")[1];
var hrefb = window.location.href.split("#")[2];
window.location.href = window.location.pathname + window.location.search + '&x=x#' + hrefa + '#' + hrefb;
如果您有哈希值,则URL必须不同才能重新加载。 &amp; x = x就是这样做的。只需将其替换为您可以忽略的内容。这是一个黑客,无法找到更好的解决方案..
在Firefox中测试。
答案 10 :(得分:0)
使用所有参数重新加载开启窗口(并非所有参数都与window.location.href一起发送方法和方法与form.submit()可能是后一步)我更喜欢使用window.history方法。
window.opener.history.go(0);
答案 11 :(得分:0)
您可以通过指定无卸载处理程序来利用HTML prompt to unload机制:
window.onbeforeunload = null;
window.location.replace(URL);
WindowEventHandlers.onbeforeunload
的{p> See the notes section了解详情。
答案 12 :(得分:0)
这有效
<button onclick="window.location.href=window.location.href; return false;">Continue</button>
没有return false;
它无效的原因是按钮点击会触发表单提交。如果显式返回false,它就不会执行表单提交,只会重新加载之前POST到该页面的同一页面。
答案 13 :(得分:0)
当我们想从子页面刷新父页面而没有任何提示时。
代码如下:
window.opener.location.href = window.opener.location;
这只是刷新父页面而没有任何提示。