如何判断IE9中的图像何时已存在于浏览器缓存中?

时间:2011-12-01 20:44:36

标签: javascript jquery image internet-explorer complete

IE9显示错误complete属性,其中包含以下内容:

$("<img/>",{src:"http://farm2.static.flickr.com/1104/1434841504_edc671e65c.jpg"}).each(function(){console.log(this.complete);});

如果您在浏览器控制台中运行此代码,(允许足够的时间加载图像),请再次运行它。 IE9是我测试过的唯一一个第二次显示false的浏览器。这似乎是一个已知的错误,从一些简单的谷歌搜索。 我需要一个解决方法,如果有人有。

这可能是一个时间问题,因为让上面的代码设置一个全局变量la:

var img = $("<img....

然后测试该变量的属性会得到不同的结果:

img[0].complete === true

 img[0].readyState === "complete"

必须有其他方式来获取此信息。任何想法......谢谢!

5 个答案:

答案 0 :(得分:2)

我用这个:

function doWhenLoaded(obj,callback) {

if($.browser.msie) {
    var src=$(obj).attr("src");
    $(obj).attr("src","");
    $(obj).attr("src",src);
}

$(obj).one("load",callback).each(function(){
    // alert(this.readyState+" "+this.src);
    if(
        this.complete
        || this.readyState == "complete"
        || this.readyState == 4
        || ($.browser.msie && parseInt($.browser.version) == 6)
    ) {
        $(this).trigger("load");
    }
}); 
}

样本:

doWhenLoaded("#main_background_img",function(){
    $("#main_background_img").slideDown(1000);  
}); 

答案 1 :(得分:0)

这就是我通常预装图像的方式:

var img = new Image();
$(img).attr('src', "foo.jpg");
if (img.complete || img.readyState === 4) {
    // image is cached
    alert("the image was cached!");
} else {
    $(img).load(function() {
        // image was not cached, but done loading
        alert("the image was not cached, but it is done loading.");
    });
}

我没有在IE9中对它进行过深度调试,但我没有遇到任何问题。

代码是从https://github.com/tentonaxe/jQuery-preloadImages/blob/master/jquery.preloadimages.js提取并修改的。

答案 2 :(得分:0)

您可以在图像上尝试AJAX请求并查看状态代码。如果它是304则意味着图像被缓存。不知道这会有多好。也许AJAX会破坏缓存。

答案 3 :(得分:0)

我知道这是在一百万年前被问过的,但我想我会提供类似的解决方案,但是开销和i / o都很少。

基本上,您创建了一个自定义jQuery方法,该方法在一个函数中执行类似的功能:

$.fn.imgLoad = function(callback) {
    return this.each(function() {
        if(callback){
            if(this.complete || (this.readyState === 4) || (this.readyState === 'complete')) {
                callback.apply(this);
            } else {
                $(this).one('load.imgCallback', function(){
                    callback.apply(this);
                });
            }
        }
    });
}

这将所有可能事件的检查合并为一个(缓存和未缓存),但也使该方法可链接。您可以使用以下方式调用它:

$('img').imgLoad(function(){
    console.log('loaded');
});

跨浏览器工作,回到IE6。请注意,它首先检查缓存,如果不是,则只触发一次命名空间加载事件,以防止在使用该逻辑调用该函数两次时重新加载,而且还允许绑定自定义加载事件(如果适用)。

答案 4 :(得分:-2)

您无法判断它是否已缓存,但您可以通过“腌制”来强制进行新的加载。文件名:

src:"http://farm2.static.flickr.com/1104/1434841504_edc671e65c.jpg?"+new Date()