【发布时间】:2011-06-19 16:13:05
【问题描述】:
当用户访问我的网站时,每个页面上都有一个“登录”链接。单击它会使用一些 JavaScript 来显示一个覆盖窗口,提示用户输入他们的凭据。输入这些凭据后,将对 Web 服务器进行 Ajax 调用以验证它们;如果它们是有效的,则会发回一个身份验证票证 cookie 并重新加载页面,以便显示页面上特定于经过身份验证的用户或(现在)当前登录用户的任何内容。
我正在通过脚本完成页面重新加载:
window.location.reload();
这对于通过 GET 请求(绝大多数)加载的页面非常有效,但有些页面使用回发表单。因此,如果用户转到这些页面之一,执行回发,然后选择登录,当window.location.reload() 脚本运行时,他们会收到一个对话框,询问他们是否要重新提交 POST 正文。
我想解决这个问题,我可以告诉浏览器重新加载页面,所以我尝试了:
window.location.href = window.location.href;
但是浏览器并没有对上述语句采取任何行动,我想是因为它认为新 URL 与旧 URL 相同。如果我将以上内容更改为:
window.location.href = window.location.pathname;
它重新加载页面,但我丢失了任何查询字符串参数。
我当前的解决方法已经足够了,但并不漂亮 - 简而言之,我将查询字符串参数附加到当前的 window.location.href 值,然后通过调用 reloadPage("justLoggedIn") 将其分配回 window.location.href,其中 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;
}
这可行,但它导致 URL 为 www.example.com/SomeFolder/SomePage.aspx?justLoggedIn,这看起来很俗气。
在 JavaScript 中有没有办法让它重新加载 GET 而不提示用户重新提交 POST 数据?我需要确保任何现有的查询字符串参数都不会丢失。
【问题讨论】:
-
怎么样:
window.location.href = window.location.href + '&reload=1';? -
@jnpcl:本质上,这是我当前的解决方法(请参阅上面提到的
reloadPage函数),但感觉很俗气。我希望有一个更优雅的解决方案。 -
奇怪的是
window.location.href = window.location.href在 Firefox 和 Chromium 下为我工作(重新加载页面)。也许尝试window.location.replace(window.location.href)(这另外使页面重新加载对用户历史记录透明)...
标签: javascript