使用image.complete来查找在Chrome上是否有缓存的图像?

8

我一直在尝试使用js查找浏览器中是否缓存了外部图像,这是我目前的代码:

<html>
    <head></head>
    <body>

    <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script>

    <script>

        function cached( url ) {
            $("#imgx").attr({"src":url});
            if(document.getElementById("imgx").complete) {
                return true;
            } else {
                if( document.getElementById("imgx").width > 0 ) return true;
            }

            return false;
        }

    </script>

    <img id="imgx" src=""  />

    <script>

        $(document).ready(function(){
            alert(cached("http://www.google.com/images/srpr/nav_logo80.png"));
        });

    </script>

    </body>
</html>

它在火狐浏览器上能够完美地运行,但在谷歌浏览器上总是返回false。

有人有什么办法可以让它在谷歌浏览器上运行吗?


1
为什么缓存资产是否存在很重要呢? :/ - Matchu
W3C标准没有这样的API,所以你可能会使用一些特定于浏览器的hack,这不是一个好的做法。 - Ankur
即使图像已缓存,加载图像仍然很可能是异步的,并且在执行下一个 JavaScript 行之前,浏览器很难完成加载和显示图像。 - RoToRa
相关内容:https://dev59.com/FnI-5IYBdhLWcg3wMFQf - Adriano
@Matchu,如果您知道缓存图像的URL(使用localStorage),则可以更早地绘制它们,而不是等待稍后加载(在DOMContentLoaded或load事件中,因为CSS和其他内容可能具有优先级,但如果可能的话,可以看到更多的图像)。 - Dan Froberg
1个回答

15

我已经使用纯JavaScript重写了你的代码,使其不再依赖于jQuery。核心功能没有改变。 Fiddle:http://jsfiddle.net/EmjQG/2/

function cached(url){
    var test = document.createElement("img");
    test.src = url;
    return test.complete || test.width+test.height > 0;
}
var base_url = "http://www.google.com/images/srpr/nav_logo80.png"
alert("Expected: true or false\n" +
      cached(base_url)
      + "\n\nExpected: false (cache-busting enabled)\n" +
      cached(base_url + "?" + new Date().getTime()));
//false = not cached, true = cached
第一次运行代码,我得到了 false and false。 再次运行代码后,我得到了 true and false
使用 .complete.height + .width 可以得到预期的结果(在 Firefox 3.6.23 和 Chromium 14 中测试)。 很可能你已经禁用了 Chrome 浏览器中的缓存。如果没有,请检查所提供图像的HTTP标头(是否存在 Cache-control?)。Google 示例中存在该标头
如果你想要检测图像是否已经(未)完成加载,请参考这个问题

我已启用了缓存,但没有设置Cache-control。我想知道的是图片会立刻加载(从缓存中)还是渐进式地加载。我发布的代码在Firefox上运行良好,但在Chrome上从未正常工作过。 - user979390
@user979390 我已经包含了一个可工作的测试案例。请参见http://jsfiddle.net/EmjQG/2/. - Rob W
这在 Chrome 上也会返回“true - false”吗?对我来说,在 Chrome 上它总是返回 false - false,我想最好的跨浏览器解决方案是设置一个计时器来计算图像加载时间。 - user979390
@user979390 它返回 false, false,然后是 true, false(Chromium 14)。观察开发者控制台的网络功能以确认图像是否已缓存。 - Rob W
1
嗯...尽管如此,出于某种原因,我现在无法在Chromium或Firefox中使其工作。在Firefox中,它总是返回false,在Chromium中,即使我可以清楚地看到响应是从缓存中提供的而没有重新验证,它也总是在新标签页的第一次加载时返回false,之后返回true。看起来这个答案不再起作用了。 - Mark Amery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接