2012-06-19 45 views
4

我的google-fu在這一張上失敗了。我有一個HTML頁面的一系列像一個在其他HTML下面穿插的div:用於預加載一組背景圖片的jquery

<div class="featureImage" style="background-image:url('defaultBackground');"> 
<a href="linkHere" style="background:url('realBackground') no-repeat center center;"> </a> 
</div> 

我發現這些特徵圖像(realBrackground)沒有被預裝所以他們只加載時的標籤顯示它們出現。我真的很想做的事情是讓jquery在頁面呈現document.ready()後將它們預先加載到背景中,以便當用戶單擊另一個選項卡時,特徵圖像的顯示是即時的,但加載不會減慢初始頁面顯示。

我得出的jquery選擇器是$(".featureImage > a").css("background-image")但我怎麼能夠編碼,以便它會通過並找到所有的實例,並實際上預先加載頁面渲染後的圖像?

UPDATE:

我得到的答案從Preloading jquery images想通了幫助和jQuery Quick Tip: Extract CSS Background Image

的關鍵是,選擇的CSS只適用於它找到的第一場比賽,這是已經給我適合。這是我想出來的,我很想有改進!

<script> 

function extractUrl(input) 
{ 
// remove quotes and wrapping url() 
return input.replace(/"/g,"").replace(/url\(|\)$/ig, ""); 
} 

function preloadImages(list) { 
    var img; 
    if (!preloadImages.cache) { 
    preloadImages.cache = []; 
} 
for (var i = 0; i < list.length; i++) { 
    img = new Image(); 
    img.src = list[i]; 
    preloadImages.cache.push(img); 
} 
} 
jQuery(document).ready(function() { 

     var items = new Array(); 
     $(".featureImage > a").each(function() { 
     items.push(extractUrl($(this).css("background-image")));}); 
     preloadImages(items); 

}); 
</script> 

TL;博士:我有我的選擇分成兩個,並使用每個()函數穿行並找到所有我想要的物品,提取的網址,並將它推到一個數組。在有了數組之後,之前的堆棧溢出答案讓我完成了其餘的任務。

+0

[Preloading jquery images]可能的重複(http://stackoverflow.com/questions/9847012/preloading-jquery-images/9847168#9847168)和[Image preloader javascript](http://stackoverflow.com/questions/8264528/image-preloader-javascript-that-supports-events/8265310#8265310)和[有沒有辦法將圖像加載到用戶的緩存異步?](http://stackoverflow.com/questions/8450068/is-there -a路至加載圖像到用戶的高速緩存,異步/ 8450190#8450190)。 – jfriend00

回答

2

我得到的答案從Preloading jquery imagesjQuery Quick Tip: Extract CSS Background Image

想通了提供幫助的關鍵是,選擇的CSS只適用於它找到的第一場比賽,這是一直讓我適合。這是我想出來的,我很想有改進!

<script> 

function extractUrl(input) 
{ 
// remove quotes and wrapping url() 
return input.replace(/"/g,"").replace(/url\(|\)$/ig, ""); 
} 

function preloadImages(list) { 
    var img; 
    if (!preloadImages.cache) { 
    preloadImages.cache = []; 
} 
for (var i = 0; i < list.length; i++) { 
    img = new Image(); 
    img.src = list[i]; 
    preloadImages.cache.push(img); 
} 
} 
jQuery(document).ready(function() { 

     var items = new Array(); 
     $(".featureImage > a").each(function() { 
     items.push(extractUrl($(this).css("background-image")));}); 
     preloadImages(items); 

}); 
</script> 

TL;博士:我有我的選擇分成兩個,並使用每個()函數穿行並找到所有我想要的物品,提取的網址,並將它推到一個數組。在有了數組之後,之前的堆棧溢出答案讓我完成了其餘的任務。

+0

但這個解決方案沒有通知瀏覽器/ JS圖片是否完成加載。 – Raptor

+0

對我來說這並不重要,我不會在完成加載時採取任何行動,我只希望他們在用戶點擊並顯示它們時等待。如果您有能夠通知瀏覽器的解決方案,我很樂意看到它並瞭解如何完成此操作。 – UltraBob

+1

是的,它是:http://stackoverflow.com/a/7588518/188331 – Raptor

4

鏈接http://thinkpixellab.com/pxloader/

這個庫實際的前負荷的圖像。

//core file 
<script type="text/javascript" src="js/PxLoader.js"></script> 

// Create the loader and queue our 3 images. Images will not 
// begin downloading until we tell the loader to start. 

var loader = new PxLoader(), 
backgroundImg = loader.addImage('images/headerbg.jpg'), 
treesImg = loader.addImage('images/trees.png'), 
ufoImg = loader.addImage('images/ufo.png'); 


// callback that will be run once images are ready 
loader.addCompletionListener(function() { 
var canvas = document.getElementById('sample1-canvas'), 
    ctx = canvas.getContext('2d'); 

ctx.drawImage(backgroundImg, 0, 0); 
ctx.drawImage(treesImg, 0, 104); 
ctx.drawImage(ufoImg, 360, 50); 
}); 



// begin downloading images 
loader.start(); 
+0

感謝您的回答!預緊很可能是錯誤的單詞。餐後實際上是我想要的,我目前遇到的麻煩的部分是如何去通過已經加載的DOM,並獲得一個網址列表加載了。因此,假如我用pxloader,目前我卡上的部分是如何動態地爲每個背景圖片,我在這個問題給出了選擇匹配做到這一點: 'backgroundImg = loader.addImage(「圖像/ headerbg 。jpg'),' 'treesImg = loader.addImage('images/trees.png'),' 'ufoImg = loader.addImage('images/ufo.png');' – UltraBob