2011-02-20 190 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; 
} 
相關問題