2010-12-10 19 views
5

Sto lavorando su un sito che è molto intensivo per l'immagine di sfondo. Poiché alcune immagini sono grandi, il fascino estetico della pagina subirà inevitabilmente il caricamento iniziale, probabilmente per diversi secondi.preloader background-image con jQuery

Così sto cercando di fare un preloader background-image con jQuery e qui è dove sono a:

$(document).ready(function(e){ 
    $('*') 
    .each(function(){ 
     if($(this).css('background-image') != 'none'){ 

      //so, i can get the path, where do i go from here? 
      alert($(this).css('background-image').slice(5, -2)); 

     } 
    }); 
}); 

Sono abituato un array di oggetti Image(), a carico l'immagine utilizzando il percorso è stato estratto dal mio iteratore, ma sono perso su dove andare da qui.

Come è possibile determinare quando tutte le immagini nell'array sono "caricate", in modo da poter richiamare una funzione per sfumare una tendina del preloader o qualcosa del genere?

risposta

3

Si dovrebbe essere in grado di tirare fuori qualcosa di simile (non testata!):

$(document).ready(function(e){ 

    // get a collection of all elements with a BG image 
    var bgImages = $('*').filter(function(){ 
     return $(this).css('background-image') != 'none'); 

    // get a collection of new images, assigning the sources from the original collection 
    }).map(function() { 
     return $("<img />").attr("src", $(this).css('background-image').slice(5, -2)); 
    }); 

    var len = bgImages.length; 
    var loadCounter = 0; 

    // use an onload counter to keep track of which ones have loaded 
    bgImages.load(function() { 
     loadCounter++; 
     if(loadCounter == len) { 

     // we have all loaded 
     // fade out curtain 
     } 
    }).each(function() { 

     // if we have been pulled up from cache, manually trigger onload 
     if (this.complete) $(this).trigger("load"); 
    }); 
}); 
+0

devo testa fuori per circa mezz'ora, quindi non sarà in grado per rispondere durante quel tempo. – karim79

+0

hai mai pensato di usare solo JPG progressivi, in modo che mostrino una bassa qualità e migliori mentre caricano? – Nilloc

+2

** @ Nilloc **: Sì, ma per questa implementazione, un preloader è quasi necessario per mantenere l'aspetto estetico del sito/pagina. Il caricamento progressivo lo farebbe apparire progressivamente meno schifoso :) – Dan

1

qui ci sono poche risorse per guardare:

Se si utilizza un DOM element invece di Image è possibile guardare l'immagine onload callback

var path = $(this).css('background-image').slice(5, -2); 
var img = document.createElement('img'); 
img.src = path; 
$(img).load(function(){ /* incrament counter for loaded images */}) 
0

Grazie a karim79 e Giosia Ruddell. Ho risolto, per il momento, con un po 'di un ibrido da suggerimenti e tentativi ed errori:

var preloaderTotal = 0; 
    var preloaderLoaded = 0; 
    var preloaderCurrent = null; 

    $('#preloaderCurtain') 
     .bind('preloaderStart', function(){ 
      $(this) 
       .show(); 
      $('*') 
       .filter(function(e){ 
        if($(this).css('background-image') != 'none'){ 
         preloaderTotal++; 
         return true; 
        } 
       }) 
       .each(function(index){ 
        preloaderCurrent = new Image(); 
        preloaderCurrent.src = $(this).css('background-image').slice(5, -2); 
        preloaderCurrent.onload = function(e){ 
         preloaderLoaded++; 
         if(preloaderLoaded == preloaderTotal - 1){ 
          $('#preloaderCurtain') 
           .trigger('preloaderComplete') 
         } 
         $('#preloaderCurtain') 
          .trigger('preloaderProgress') 
        }; 
       }); 
     }) 
     .bind('preloaderComplete', function(){ 
      $(this) 
       .fadeOut(500) 
      startAnimation(); 
     }) 
     .bind('preloaderProgress', function(e){ 
      $('#preloaderProgress') 
       .css('opacity', 0.25 + (preloaderLoaded/preloaderTotal)) 
       .text(Math.floor((preloaderLoaded/preloaderTotal) * 100) + '%'); 
     }) 
     .trigger('preloaderStart'); 
1
// Get all backgrounds 
    var bgImages = $('*').filter(function() 
    { 
     return ($(this).css('background-image') != 'none'); 
    }) 
    // Create IMG objects for it 
    .map(function() 
    { 
     // Works in Chrome!!! Chrome not uses brackets near url() 
     return $('<img />').attr('src', $(this).css('background-image').replace(/\url|\(|\"|\"|\'|\)/g, '')); 
    }); 

    var len = bgImages.length; 
    var loadCounter = 0; 

    $(bgImages).each(function() 
    { 
     $(this).load(function() 
     { 
      loadCounter++; 
      console.log(loadCounter); // Look at console 
      if(loadCounter == len) { // ALL LOADED!!! } 
     }); 
    }) 
    // Cached trigger 
    .each(function() 
    { 
     if (this.complete) $(this).trigger('load'); 
    });