如何在Javascript中没有POSTDATA警告的情况下重新加载页面?


68

我想使用以下方法重新加载页面:

window.location.reload(true); 

但是我收到POSTDATA警告,因为刷新功能想重新发送以前的POST表单数据。如何在没有此警告的情况下刷新页面?

更新:我无法控制该项目!我无法解决POST本身!


重新提交POST(这是重新加载的作用)将始终显示该警告。您可以执行另一次POST而不是重新加载,尽管如果您经常这样做会填满用户浏览器的历史记录,并且如果单击后退按钮,他们仍然会收到警告。
山姆·哈斯勒2009年

Answers:


65

仅更改window.locationJavaScript是很危险的,因为用户仍然可以按“后退”按钮并重新提交帖子,这可能会产生意想不到的结果(例如重复购买)。PRG是更好的解决方案

使用发布/重定向/获取(PRG)模式

为避免此问题,许多Web应用程序都使用PRG模式-POST操作返回重定向命令(使用HTTP 303响应代码(有时是302)以及HTTP“ Location”响应标头),而不是直接返回HTML页面,指示浏览器使用HTTP GET请求加载其他页面。然后可以安全地将结果页面添加为书签或重新加载,而不会产生意外的副作用。


我无法控制该项目。我无法解决POST本身!
Ricibald

PRG是在POST之后完成的,它以静默方式将客户端重定向到GET页面,因此他们的历史记录中没有POST。(值得您控制的人。)如果那是您无法做到的,那么您可以导航到GET页面而不是重新加载POST吗?
山姆·哈斯勒2009年

3
是的,但是重定向POST需要某种形式的控制
Ricibald

我们如何使用PRG,我还是不明白,当我重新加载页面时,它总是问我是否要重新加载,如何在这里应用PRG,请您提供示例代码
Gina Gina

128

没有警告,您无法刷新;refresh指示浏览器重复上一个操作。如果重复最后一个操作涉及重新提交数据,则由浏览器决定是否警告用户。

您可以执行以下操作重新导航到具有新会话的同一页面:

window.location = window.location.href;

用户仍然可以点击“后退”按钮并重新提交该帖子,这可能会产生意想不到的结果(例如重复购买)。PRG是一个更好的解决方案。
山姆·哈斯勒2009年

也许可以,但是如果用户出于任何原因单击它仍会收到警告,则使用PRG取决于重新提交的后果。
AJM

是的,如果服务器识别出重复的帖子,这不是问题,但是仍然会向用户显示一个对话框供您担心。使用PRG,用户将永远不会看到该对话框。
山姆·哈斯勒

3
@sam您已超出问题范围。我们不知道如何或为何提问者是在情况他什么事。
雷克斯中号

1
请注意,当网址包含#时,这将不起作用(至少在firefox中如此)。
Leven

21

我在使用Rex的解决方案无法重新加载anchor / hash-urls(包括#)时遇到了一些问题...

所以我最后通过删除哈希部分结束了:

window.location = window.location.href.split("#")[0];

12

要绕过POST警告,您必须使用完整的URL重新加载页面。工作良好。

window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname;

这是行不通的。尽管它确实绕过了POST警告,但它也绕过了发送任何可能需要的post变量。
iankit 2014年

然后将window.location.hash添加到末尾。
伊恩·斯坦威(Yan Stanway)

有关带有协议(如果不是80)和参数的完整URL,请参阅bl.ocks.org/abernier/3070589
伊恩·斯坦威(Yan Stanway)

这个版本没有传递get查询参数,我使用了以下修改的版本:window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname + window.location。搜索;
Patlatus '16


5

window.location.replace(window.location.href)怎么样?


3

这工作

<button onclick="window.location.href=window.location.href; return false;">Continue</button>

没有它就无法工作的原因

返回false;
是以前将其视为表单提交按钮。带有显式的return false时,它不会执行表单提交,而只是重新加载同一页面,这是先前对该页面进行POST的结果。


2

如果您处于完成发布数据的阶段,并且只想重新查看该页面,则可以使用window.location甚至附加一个随机字符串作为查询参数,以确保新版本的页。


2

Nikl的版本未传递get查询参数,我使用了以下修改后的版本:

window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname + window.location.search;

或者我需要刷新最顶部的页面\框架,因此我使用了以下版本

window.top.location.href = window.top.location.protocol +'//'+ window.top.location.host + window.top.location.pathname + window.top.location.search;

1
<html:form name="Form" type="abc" action="abc.do" method="get" onsubmit="return false;">

method="get" -解决了问题。

if method="post" 那么只有警告来了。


0

我编写了一个无需重新提交即可重新加载页面的函数,它也可以使用哈希值。

我通过在URL中添加/修改GET参数(reload通过使用当前时间戳(以毫秒为单位)更新其值)来做到这一点。

var reload = function () {
    var regex = new RegExp("([?;&])reload[^&;]*[;&]?");
    var query = window.location.href.split('#')[0].replace(regex, "$1").replace(/&$/, '');
    window.location.href =
        (window.location.href.indexOf('?') < 0 ? "?" : query + (query.slice(-1) != "?" ? "&" : ""))
        + "reload=" + new Date().getTime() + window.location.hash;
};

请记住,如果要在href属性中触发此功能,请以以下方式实现:href="javascript:reload();void 0;"成功运行它。

我的解决方案的缺点是它将更改URL,因此此“重新加载”不是真正的重新加载,而是具有不同查询的加载。尽管如此,它仍然可以像我一样满足您的需求。


0

您不会被迫使用JavaScript来做所有事情。许多问题都有这样简单的解决方案。您可以使用以下棘手的锚点:

<a href=".">Continue</a>

当然,我知道您可能需要自动解决方案,但这在很多情况下都会有所帮助。

祝好运


-1

在HTML中使用元刷新

<meta http-equiv='refresh' content='1'>

在PHP中使用元刷新

echo "<meta http-equiv='refresh' content='1'>"

-1

这是一个应该始终有效并且不会删除哈希的解决方案。

let currentPage = new URL(window.location.href);
currentPage.searchParams.set('r', (+new Date * Math.random()).toString(36).substring(0, 5));
window.location.href = currentPage.href;

-1

其他解决方案window.location对我不起作用,因为它们根本没有刷新它,所以我要做的是,我使用一个空表格将新的和空的postdata传递到同一页面。这是基于此答案的一种方法:

function refreshAndClearPost() {
    var form = document.createElement("form");
    form.method = "POST";
    form.action = location.href;
    form.style.display = "none";

    document.body.appendChild(form);
    form.submit();    //since the form is empty, it will pass empty postdata
    document.body.removeChild(form);
}

-2

如果您使用GETmethod代替,POST那么我们将无法提交表单值。如果使用,window.opener.location.href = window.opener.location.href;则可以触发db,并且可以获取该值,但唯一JSP的好处是即使具有表单值的scriplet也不刷新。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.