POST后重新加载浏览器窗口,而不提示用户重新发送POST数据

时间:2011-02-02 00:54:43

标签: javascript

当用户访问我的网站时,每个页面上都有一个“登录”链接。单击此按钮可使用一些JavaScript显示覆盖窗口,提示用户提供其凭据。输入这些凭证后,将对Web服务器进行Ajax调用以验证它们;如果它们有效,则会发回验证票证cookie并重新加载页面,以便显示特定于已验证用户或(现在)当前登录用户的页面上的任何内容。

我正在使用以下命令完成页面重新加载:

window.location.reload();

这非常适用于通过GET请求(绝大多数)加载的页面,但有些页面使用回发表单。因此,如果用户转到其中一个页面,执行回发,然后选择登录,则当window.location.reload()脚本运行时,会出现提示他们是否要重新提交POST正文的对话框。

Resubmit POST body dialog box

我想绕过这个我可以告诉浏览器重新加载页面,所以我尝试了:

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数据?我需要确保任何现有的查询字符串参数都不会丢失。

14 个答案:

答案 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;

经过测试

  • Chrome 44.0.2403
  • IE edge
  • Firefox 39.0

答案 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;

这只是刷新父页面而没有任何提示。