【问题标题】:JS: check if hidden image is still in browser's cache?JS:检查隐藏图像是否仍在浏览器的缓存中?
【发布时间】:2016-12-18 20:21:14
【问题描述】:

我们的网页包含基于 36 张产品图片的 360 度产品查看器。一次只显示一个图像,所有其他图像都被隐藏。所有图像都从没有缓存指令的 AWS S3 存储桶提供(应该是这样)。在第一次启动 JS 插件显示 36 图像的预加载器和 加载后一切正常。

当用户在另一个选项卡中工作时,当网络选项卡(仅在 chrome 中测试)长时间(几个小时)保持打开状态时,就会出现问题。那些隐藏的图像正在从缓存中删除,JS 脚本再次重新加载所有这些图像,360 药物看起来很奇怪(不流畅)。浏览器加载所有缺失的图像后,它会再次开始流畅地工作,并且在几个小时不活动后它会再次重复。

这种行为是我们所期望的,但我们想以某种方式检查隐藏图像是否不再缓存以调用预加载器。

我在网络和 stackoverflow 中搜索了答案,但所有其他与缓存相关的问题都没有回答我的问题,例如“检查图像是否在重新打开浏览器或缓存后被缓存”。我的问题是:如何检查隐藏图像是否仍在缓存中?

示例代码赞赏。谢谢!

PS - 我知道如何为从 S3 传递的图像启用缓存标头,这不是一个选项。

PSS - 创建 1px 图像支架也不是一种选择。

【问题讨论】:

  • 不确定它是否正是您正在寻找的解决方案,但如果您调用预加载器会怎样——无论如何?如果图像在缓存中 - 一切正常并且不会与服务器建立新连接,否则 - 图像将在需要时可供浏览器使用。至于什么时候运行预加载器——我想你可以有一个变量来保存lastPreloadTime,如果用户与页面有任何交互(鼠标输入在文档上?),检查是否(比如说)10分钟后过去了最后一次预加载,然后再次运行预加载。
  • 感谢您的建议,但这也不是一个选择。我们已经考虑过了,但这是一个非常复杂的系统,不仅仅是 36 张图像,还有许多动态预加载的图块(在缩放事件等时),用户可以切换到该选项卡仅检查当前(最后)ajax 返回的统计信息和可能不需要完全重新加载,因此我们宁愿仅在确实需要时才中断用户界面 - 例如当我们从缓冲区中丢失隐藏图像时。
  • 不确定我是否理解您的问题。假设您有一个魔术函数,它获取图像列表(您的隐藏图像)作为输入,并返回这些图像的子列表,这些图像不再在缓存中。现在 - 您将预加载这些图像(使用您的预加载器功能)。为什么你需要这个神奇的功能来告诉你图像是否被缓存?只需再次运行预加载器(在隐藏图像上),您将从缓存(或服务器)中获取它们。您知道隐藏的图像,只需预加载它们。
  • 再次感谢,但我不是在寻找解决方法,我有确切的问题。 PS - 我们正在使用大量的外部自定义 jQuery 插件,该插件仅提供缩小版本并每月更新,所以我不想每年 12 次弄乱它的代码。我们请求了几个函数和回调,但现在在 SUBJECT 上寻找答案。
  • 你试过Using image.complete to find if image is cached on chrome中给出的技术了吗?

标签: javascript amazon-web-services amazon-s3 browser-cache


【解决方案1】:

正如您在 cmets 中提到的 - 您不想弄乱您的预加载器代码,也不想每次都启动您的预加载器。

您的问题的答案是“不,没有 100% 跨浏览器的方式来判断图像是否在缓存中”,但是,您可以通过测量加载开始和结束之间的时间来猜测它。

因此,您可以在页面上添加一个准预加载器脚本,该脚本会尝试预加载所有隐藏的图像,并且,如果每张图像所花费的平均时间超过某个阈值(例如 100 毫秒或类似的值) - 它会启动您的主预加载器,因此您可以避免在主预加载器启动时不必要的页面阻塞/数据丢失。

只要您的所有图像都在缓存中 - 准预加载器不会占用太多资源来检查所有图像。

它应该是什么样子的一些非常“肮脏”的例子:

    window.needsPreloadingFlag=false;

    window.onfocus = function () {
        if (!window.needsPreloadingFlag) {
            needsPreloadingFlag = quasiPreloader.checkHiddenImages();
        }
    };

    yourApp.onUserActionThatProbablyNeedsPreloading = function (){ 
    //that should be bound to events that require your hidden images
        if (window.needsPreloadingFlag) {
            yourApp.preloadImages();
        }
        //...
    }

【讨论】:

  • 对于为期一周的赏金问题,只有 70 次观看,由于问题是自我解释的,我猜大多数路过的人不知道答案。看起来真的没有办法检查隐藏图像是否仍在浏览器的缓存中。我将使用我自己的解决方法,但由于您是直接回答问题的人,我的意见是一样的,我认为赏金给您是公平的。祝你好运!
猜你喜欢
  • 2011-01-27
  • 2014-08-07
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2012-03-01
  • 2015-12-07
  • 1970-01-01
相关资源
最近更新 更多