2011-02-20 169 views
120

我想设置body标签的背景图像,然后运行一些代码 - 这样的:如何检查背景图片是否已加载?

$('body').css('background-image','http://picture.de/image.png').load(function() { 
    alert('Background image done loading'); 
    // This doesn't work 
}); 

我怎样才能确保背景图像满载?

+4

相同的URL就分配给'图片()'对象,它确实有'onload'事件。 –

+2

请确保将css url包装在'url()' – bluescrubbie

回答

232

试试这个:

$('<img/>').attr('src', 'http://picture.de/image.png').on('load', function() { 
    $(this).remove(); // prevent memory leaks as @benweet suggested 
    $('body').css('background-image', 'url(http://picture.de/image.png)'); 
}); 

这会在内存中创建新的图像,并使用load事件被加载在src时被检测到。

+6

看起来像图像会被无故加载两次。 – HyderA

+39

@gAMBOOKa因为它们停留在浏览器内存中,所以它们只加载一次。这是相同的,当你把隐藏的图像放在页面的顶部,然后将其设置为CSS - 所以图像在css文件之前开始下载 - 这就是所谓的预加载。 – jcubic

+3

我不太确定,但我认为你指的是缓存。我不认为存储资产的浏览器内存是这样的。如果您指的是缓存,请记住您正在添加额外的HTTP请求,并且所有客户端可能没有启用缓存。 – HyderA

7

CSS资产没有JS回调。

+1

感谢您的快速回答。任何想法解决方案的解决方法? – Peter

+5

这不回答这个问题。我不明白它有多少票。 – Seb

14

事情是这样的:

var $div = $('div'), 
    bg = $div.css('background-image'); 
    if (bg) { 
    var src = bg.replace(/(^url\()|(\)$|[\"\'])/g, ''), 
     $img = $('<img>').attr('src', src).on('load', function() { 
     // do something, maybe: 
     $div.fadeIn(); 
     }); 
    } 
}); 
+0

hello ...这似乎工作,虽然我设置bg.replace为'bg.replace(...,my_src) '但是我的问题是:一旦$('')加载,那么''究竟发生了什么......我的意思是它实际上并不是真的 - 它只是一个虚拟的占位符,对吧? – dsdsdsdsd

+0

对,''从来没有插入到DOM中;它只是用来“愚弄”浏览器,将图像文件加载到缓存中 – Colin

+0

有用,如果你不想调用jQuery – vwvan

22

我有一个名为jQuery pluginwaitForImages背景图片下载,可以检测。

$('body') 
    .css('background-image','url(http://picture.de/image.png)') 
    .waitForImages(function() { 
    alert('Background image done loading'); 
    // This *does* work 
    }, $.noop, true); 
+0

这个插件也很棒,能够显示加载进度使用''each'回调。 – Soviut

+1

@alex,我应该如何检查每个背景图像中的每个元素?我尝试过,但似乎没有做到这一点。$('。user_main_photo_thumb')。 waitForImages(function(){ \t $(this).parents('。photoThumbFrame')。delay(1000).slideDown(); \t},function(loaded,count,success){ \t}); – Relm

+0

@Relm你没有正确使用它。第二个回调是每个图像。另外,'delay()'不能像那样工作。 – alex

6

这里是一个小插件,我做了让你做的正是这一点,它也适用于多重背景图像和多个元素:

阅读文章:

http://catmull.uk/code-lab/background-image-loaded/

或直接进入插件代码:

http://catmull.uk/downloads/bg-loaded/bg-loaded.js

所以只包含插件,然后调用它的元素:

<script type="text/javascript" src="http://catmull.uk/downloads/bg-loaded/bg-loaded.js"></script> 
<script type="text/javascript"> 
    $('body').bgLoaded(); 
</script> 

显然下载该插件并将其存储在自己的主机。

默认情况下,一旦在后台加载,但你可以很容易地改变,通过传递一个不同的功能像这样增加了额外的“BG-装”类每一个匹配元素:

<script type="text/javascript" src="http://catmull.uk/downloads/bg-loaded/bg-loaded.js"></script> 
<script type="text/javascript"> 
    $('body').bgLoaded({ 
     afterLoaded : function() { 
     alert('Background image done loading'); 
     } 
    }); 
</script> 

这里证明它正在工作的codepen。

http://codepen.io/catmull/pen/Lfcpb

+0

作品非常好! – Vickel

+0

如果失败会怎么样? –

2

我做了一个纯JavaScript破解使之成为可能。

<div class="my_background_image" style="background-image: url(broken-image.jpg)"> 
<img class="image_error" src="broken-image.jpg" onerror="this.parentElement.style.display='none';"> 
</div> 

或者

onerror="this.parentElement.backgroundImage = "url('image_placeHolder.png')"; 

CSS:

.image_error { 
    display: none; 
} 
相关问题