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

我想重新加载一个页面使用:

window.location.reload(true);

但是我收到了 POSTDATA 警告,因为刷新函数希望重新发送以前的 POST 表单数据。如果没有此警告,如何刷新页面?

更新: 我无法控制这个项目! 我无法解决 POST 本身的问题!

155845 次浏览

不能在没有警告的情况下刷新; refresh 指示浏览器重复上一个操作。如果重复最后一个操作涉及重新提交数据,则由浏览器选择是否警告用户。

你可以重新导航到相同的页面,使用一个新的会话,方法是:

window.location = window.location.href;

如果您已经完成了发布数据,只是想重新查看页面,那么您可以使用 window.location,甚至可以添加一个随机字符串作为查询参数,以确保页面的新版本。

仅仅在 JavaScript 中更改 window.location就是 很危险,因为用户仍然可以点击 后面的按钮并重新提交文章,这可能会产生意想不到的结果(比如 重复购买)。PRG 是一个更好的解决方案

使用 Post/Redirect/Get (PRG)模式

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

客户端

如果你想完全在客户端进行刷新,你需要在进行刷新之前更改浏览器历史记录:

if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
window.location = window.location.href;

如果您使用 GET方法而不是 POST,那么我们就不能使用表单归档值。如果您使用 window.opener.location.href = window.opener.location.href;,那么我们可以触发数据库,我们可以得到这个值,但是唯一的问题是,即使脚本具有表单值,JSP也不会刷新。

替换(window.location.href)怎么样

要绕过 POST 警告,必须重新加载带有完整 URL 的页面。

window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname;
<html:form name="Form" type="abc" action="abc.do" method="get" onsubmit="return false;">

method="get"-解决问题。

if method="post"然后只有警告来。

你可以使用 JavaScript:

window.location.assign(document.URL);

我在火狐浏览器和 Chrome 浏览器上都能用

检查这个链接: http://www.codeproject.com/Tips/433399/PRG-Pattern-Post-Redirect-Get

我遇到了一些锚/hash-urls (包括 #)不能使用 Rex 的解决方案重新加载的问题..。

所以我最终删除了 hash 部分:

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

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;

我已经写了一个函数,将重新加载的网页没有后提交,它将工作与散列,也。

我通过在名为 reload的 URL 中添加/修改 GET 参数来实现这一点,方法是使用以 ms 为单位的当前时间戳更新它的值。

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,所以这个“重新加载”不是真正的重新加载,而是一个带有不同查询的加载。不过,它可以满足你的需求,就像它适合我一样。

成功了

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

它在没有

返回虚假;
的情况下无法工作的原因是,之前它将
返回虚假;
视为一个表单提交按钮。如果显式返回 false,则不执行表单提交,而只是重新加载前一个 POST 到该页面所导致的相同页面。

在 html 中使用 meta 刷新

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

在 PHP 中使用 meta 刷新

echo "<meta http-equiv='refresh' content='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;

使用 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);
}

你不必强迫自己使用 javascript 来做所有的事情。许多问题都有这样简单的解决办法。你可以使用这个棘手的锚:

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

当然,我知道你可能需要一个自动解决方案,但这将有助于在许多情况下。

祝你好运

好好利用

location.reload(true);

没有 window