Javascript重新加载预加载的图像

Javascript重新加载预加载的图像,javascript,jquery,image,preload,Javascript,Jquery,Image,Preload,下面的Javascript旨在预加载图像,将div的背景设置为图像,然后淡入整个div $("<img/>") .attr("src", "../services/imageResize.php?img=" + img + "&width=150") .load(function(e){ $("<div/>", { class: "smallThumb" }) .css("ba

下面的Javascript旨在预加载图像,将div的背景设置为图像,然后淡入整个div

$("<img/>")
    .attr("src", "../services/imageResize.php?img=" + img + "&width=150")
    .load(function(e){
        $("<div/>", {
            class: "smallThumb"
        })
        .css("background", "url(" + $(this).attr("src") + ") no-repeat center center")
        .appendTo(images)
        .fadeIn(500);

        if(count == imgTotal)
        {
            loadingImages = false;
            images.css("background","#fff");
        }
    });
count++;
$(“”{
班级:“小拇指”
})
.css(“背景”,“url”(+$(this).attr(“src”)+”)无重复中心)
.appendTo(图像)
.fadeIn(500);
如果(计数==imgTotal)
{
加载图像=错误;
css(“背景”,“#fff”);
}
});
计数++;

我在Chrome和Safari中测试过它;两者都将div淡入,然后完成图像加载。我对是什么导致它为.css语句重新加载图像感到困惑。

您是否尝试将图像硬编码到隐藏的页面中,并查看发生了什么?问题的一部分是,您正在传递URL参数,这可能会使图像彼此唯一。

这是两件不同的事情。HTMLDOM和CSS,它将加载两次。他们俩都不太了解对方。仅仅因为您使用相同的src“string”,并不意味着它们使用相同的src图像内容。我会将图像src设置为单像素类型,然后加载背景。这是一个有很好文档记录的CSS背景图像方法。此外,缓存可以帮助它至少不会从服务器请求两次。无论如何,这是一件好事。

我认为您的问题是,
onload
事件在映像完全加载之前触发。如果您假设图像已完全加载,它将显示为正在重新加载

每当bowser准备渲染图像时,
img.onload
将触发。毫无疑问,图像将被完全加载。测试图像是否已完全加载的唯一方法是使用
img.complete
属性

不久前我回答了这个问题

在回答之后,我写了一点

你可以像使用它一样使用它

$(function () {
    $.preload('your-image.png').progress(function (img) {
        // set background
        $('body').css('background', 'url(' + img.src + ')');
    });
});

检查两个映像请求的标题,并查看是否输出了适当的缓存逻辑。可能您没有缓存头,因此浏览器被迫获取两个版本,即使它们是同一个映像。有两个部分,缓存良好,不使用大映像加载DOM src,另一部分让CSS完成工作。缓存只是隐藏了编码问题。正如Marc B所说,由于您是从PHP脚本获取图像,因此web服务器可以将标题设置为无缓存。如果你愿意,发布一个链接到其中一个图片,这样我们就可以检查了。哦,停止使用img-take作为css背景资料。img部分在查看代码时真的毫无意义,css正在为div设置背景。