2012-07-14 52 views
5

如果您对此问题有更好的标题,请随时编辑。location.reload with cache

最长的时间,我总是用location.reload()重新加载页面 - 这是最合乎逻辑的事情,对吧?

但我最近注意到它不是F5的等价物,正如我最初想的那样,但更多的是Ctrl + F5。所有图像和其他链接的文件都从服务器重新请求,当我想要做的是重新加载页面。

我发现我可以使用location.replace(location.href),这似乎达到了我想要的效果:重新加载页面,但从缓存中检索链接的文件。

这是理想吗?有没有比这更好的方法?我忽略了这种方法可能存在的缺陷吗?

(注意:我已经有缓存清除管理上链接的文件,如脚本,通过附加filemtime作为查询字符串)

+0

window.location.reload(false);将从缓存中重新加载... – Drewness 2012-07-14 16:57:44

+0

@TGxANAHEiiMx [“如果它是错误的或未指定,浏览器可能会从缓存中重新加载页面。”](https://developer.mozilla.org/en/DOM/window。位置) - 请注意“可能”和“页面”的使用 - 它没有提及任何关于“将”或链接的文件。 – 2012-07-14 17:00:05

+0

啊,点了。从“最佳实践”的角度来看,这不是最好的,因为它不仅仅是一种“功能性”的情况。 – Drewness 2012-07-14 17:07:13

回答

4

在回答我自己的问题,有一个巨大的陷阱:当位置包含散列,浏览器将跳转到该散列,而不是重新加载页面。

予实现的解决方案如下:

reload = (function() { 
    var m = location.search.match(/[?&]__hash=([^&]+)/); 
    if(m) location.hash = unescape(m[1]); 
    return function() { 
      var h = location.hash; 
      if(h == "") { 
        location.replace(location.href); 
      } 
      else { 
        var s = location.search; 
        s = s.replace(/[?&]__hash=[^&]+/,''); 
        s += (s == "" ? "?" : "&")+"__hash="+escape(h); 
        location.replace(location.pathname+s); 
      } 
    }; 
})(); 

假定在服务器侧使用什么$_GET['__hash'],这可以安全地使用。