2010-05-14 127 views
7

我们发现完整的浏览器缓存是导致我们的外部网络出现问题的原因。它只影响到我们的一小部分用户,但我们希望提醒他们这个问题,并给他们一些关于如何为自己解决问题的指导。检测浏览器的缓存是否已满

我们希望使用类似于GMail使用的系统。当它检测到您的浏览器的缓存 已满时 的行为不像它应该那样,它会显示一条警告消息,告诉用户它们的缓存已满,并且可能会导致GMail出现问题以及指向Gmail Help page on clearing your browser's cache的链接。

有没有人知道是否有任何资源,或如何使用JavaScript来检测浏览器的缓存 行为不好的例子?

谢谢。


澄清:我们实际上是试图检测,我想,是不是从高速缓存是否是满的,但一个脚本,这是我们配置的服务器端,而是否被存储在高速缓存正在被服务器重新请求 - 这样一来,浏览器就会表现得很奇怪,或者就好像它的缓存没有像应该那样运行。


进一步明确:谢谢大家对缓存的更新。我们的脚本正在使用正确的标题发送,而我们在IE6和IE7中只能看到这个问题 - Mozilla和WebKit浏览器似乎没有受到影响 - 但我仍然不确定我们会如何使用JavaScript以及/或XmlHttpRequest来检查是否从缓存中检索到对象,从而让我们检查缓存是否表现不佳。

+1

独立于本是否真的是可能的(我怀疑它),当被认为是完全浏览器缓存,因为它基本上是其中最早的数据将被删除队列,在需要空间时。或者什么时候不满?没有满的需要用户定期清空它,大多数人从来没有做过什么... – RoToRa 2010-05-14 15:15:24

+2

我很好奇如何以及为什么你确定一个* full *缓存是问题,而不是缓存中的数据冲突或者一些这样的事情。总之,如果你是那得到了很多的滥用上comp.lang.javascript的同一人(http://groups.google.co.uk/group/comp.lang.javascript/browse_thread/thread/45bcce73055047bd/d003efbfda8c4512) ,我希望你在stackoverflow上得到更好的治疗... – 2010-05-14 15:21:23

+0

嘿......不,那不是comp.lang.javascript上的我。 我想我真的问的是GMail正在做什么来检测您的浏览器的缓存是* full *,并向最终用户显示此消息。 通过你的链接,并通过快速阅读,我设法找到这个讨论(http://groups.google.com/group/comp.lang.javascript/browse_frm/thread/ce1ac46f82dfa7c9?pli=1),这说明了什么可能会继续,以及如何去做。 谢谢! – abitgone 2010-05-14 15:29:07

回答

5

浏览器的缓存将不会如果它已满...会带来一些小问题。

  1. 如果浏览器缓存已满,浏览器只需下载新鲜的内容与将其从本地缓存中拉出即可。 (例如较慢)
  2. 如果浏览器缓存包含无效数据(例如JavaScript文件的旧副本),那么可以,您可能会遇到问题。 (不是因为缓存已满,而是因为您没有为用户提供一个新文件(Google for:expires headers以及如何在更改脚本时更改文件的URL路径以确保“中断”缓存))
  3. 在Internet Explorer中,当您向用户推送下载文件(例如Excel电子表格)时,它必须进入缓存才能工作(IE bug) - 我是不确定如果文件较大比用户的总缓存,如果会与该文件问题进行存储,因此加载(堆垛请随时确认是否属于这种或那种方式)

更新: 根据您的澄清,你需要确保你向客户端发送任何脚本适当缓存...这意味着:

  • 更改URL到您的脚本时,你想要一个新的版本是下载(例如)
  • 一旦确认该URL的变化,您可以发送缓存头,告诉浏览器缓存中的文件很长一段时间(例如,您的JS库文件(如jQuery的)可能不会改变每隔一小时,这将可能无法正常工作一天,一周或一个月甚至)
+0

鉴于这种情况,你会建议等到页面已经完成加载,然后发射过的是载入页面的''部分相同的脚本(的头)的异步请求,然后检查,看看是否它是从缓存还是从服务器加载? – abitgone 2010-05-14 16:23:57

0

是。但它只是一个想法:

var img = new Image(); 
(new Image).src = "imageWithFarFutures.png"; 
window.onload = function(){ 
    document.getElementById("someIframe").src = "imageWithFarFutures.png"; 
    // NOW if the server DOES get a FRESH request for "imageWithFarFutures.png" 
    // wouldn't it mean that the browser has kicked it out of its cache? 
}; 
0

考虑发送一个头,让你的应用程序永远不会缓存你的内容并让它立即过期。

+0

为什么?这完全违背了我们想要做的 - 我们希望这部分内容能够缓存。 – abitgone 2010-05-14 16:14:14