【问题标题】:Can I tell from javascript whether my page was hard refreshed?我可以从 javascript 中判断我的页面是否难以刷新吗?
【发布时间】:2013-09-12 17:42:45
【问题描述】:

我已经放弃了,但出于好奇,我想我会在这里发帖。

我所说的“硬刷新”是您在开发期间执行的 Ctrl+RShift+F5 以查看您的更改。

这会导致浏览器将Cache-Control: max-age=0 标头添加到请求“子”请求,如图像和脚本等。

如果你在做你的工作,你会得到一个304,除了改变的资源。 (好吧,好吧,看看 cmets。这是假设其他验证器是基于浏览器缓存发送的。)

到目前为止,一切都很好。

问题是我不是直接从页面加载脚本,而是通过load.js,浏览器在这些请求中是否包含Cache-Control 标头不一致。 Chrome 根本不这样做,而 Firefox 似乎停在了一个系列的中间。

由于我无法访问当前请求的标头,因此无法知道是否应包含该标头。

结果是,当我更改脚本(load.js 除外)时,硬刷新无法可靠地工作,我必须清除浏览器缓存(这有点笨拙)。

对此有什么想法吗?

【问题讨论】:

  • 我没有一个完整的答案,但是你可以对时间做些什么吗?例如。服务器延迟一个虚拟静态文件(例如带有usleep(1000)的php)并查看它的加载速度。如果它在
  • 如果您通过告诉我使用缓存来响应Cache-control: max-age=0 的请求,那么您没有完成您的工作。根据规范,必须遵守该标题。
  • @Pointy,好吧,很公平。即使max-age=0,我仍然使用缓存副本,所以是的,这违反了规范。我认为这是避免不必要负载的常用方法。基本上我用它作为强制重新验证的一种方式(在重新验证可能很昂贵的情况下),而不是重新生成。
  • 好吧,您正在对客户端是什么做出一些重大假设,这对于您的内容/站点/应用程序来说可能没问题。客户端可能没有拥有所请求资源的缓存副本。
  • @Pointy,对,我的意思是当其他验证器包含在max-age=0 中时,我会优先考虑它们,并且浏览器会在它们可用时发送所有这些验证器。 (对于静态内容,IIS 也是如此。)我使用服务器端缓存来生成内容,即使max-age=0,如果我确定缓存相对于其源是最新的。在这些情况下,我当然会发送200 和完整的回复。所以也许这不会违反规范。

标签: javascript browser-cache


【解决方案1】:

很遗憾,您无法检测到来自 JavaScript 的硬刷新(无法访问当前加载页面的标题)。

但是,服务器可以从请求标头中判断这是否是硬刷新,因此可以选择合作。例如,服务器可以在响应中包含一个自定义的<meta> 标签,或者向<body> 添加一个特殊的类,然后您的脚本就可以访问这些信息。

一旦load.js 检测到硬刷新,它就可以将其传播到依赖脚本,例如在请求中附加一个 URL 参数(想想"?t=" + timestamp)。

【讨论】:

  • 乔恩,感谢您的回复。我想过这一点,但这不会破坏页面本身缓存的目的吗?也就是说,如果父页面没有改变,那么它应该返回一个304。但是,既然您提到了它,那么在加载程序脚本本身中执行此操作是合理的,因为它很小。也就是说,总是返回一个值来指示缓存是否被绕过。不过,我怀疑我是否会在实践中这样做,因为这个问题只会影响我。
  • @harpo:JavaScript 的问题在于它没有 304 的概念。它开始在网页的上下文中执行,但它不知道自己或页面是如何到达那里的。因此建议在页面内部放置一些东西。
  • 乔恩,明白了。这是一个创造性的解决方案,但我认为打破页面缓存的成本并没有超过这个用例的好处。我说“破坏缓存”是因为据我了解,该页面现在将依赖于请求标头,而不管其内容如何。
  • @harpo:我不确定你在这里如何定义“依赖”。服务器可以查看Cache-Control 标头,如果它闻到硬刷新的味道,它会根据它执行它的操作。假设您没有得到误报,缓存将如何中断?
  • 我不认为这可以按预期工作。特别是,“硬重新加载”页面可能会以浏览器利用缓存的多种方式之一缓存自身,因此可能仍指示硬重新加载,但实际上并非如此。
【解决方案2】:

您可以尝试检查 localStorage。设置一个 localStorage 变量并检查它。如果存在,则不是硬刷新,否则,是硬刷新。

【讨论】:

  • 当您尝试使用它时浏览器不会提示吗?诸如“此网站想在您的计算机上存储数据”之类的内容。
  • localStorage 无论页面如何加载(新/硬/软重新加载)都会持续存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2017-12-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
相关资源
最近更新 更多