2009-12-18 10 views
19

J'ai la classe CSS suivantComment vérifier que l'image de fond (css) a été chargée?

.bg { 
    background-image: url('bg.jpg'); 
    display: none; 
} 

que j'application sur une étiquette de TD.

Ma question est comment puis-je dire avec JavaScript/jQuery que l'image de fond a fini de se charger?

Merci.

MISE À JOUR: ajout d'une propriété d'affichage. Depuis mon objectif principal, il bascule en vue.

Répondre

32

Le seul moyen que je connaisse pour le faire est de charger l'image en utilisant Javascript, puis de définir cette image comme arrière-plan.

Par exemple:

var bgImg = new Image(); 
bgImg.onload = function(){ 
    myDiv.style.backgroundImage = 'url(' + bgImg.src + ')'; 
}; 
bgImg.src = imageLocation; 
+0

Pour une raison bizarre le onload ne se déclenche que lorsque le ImageLocation prend effectivement un peu de temps à charger, comme à partir du Web. Cela ne fonctionne pas dans les tests locaux avec 0 temps de chargement. – thedp

+1

vous pouvez définir un délai d'attente pour 'bgImg.src = imageLocation;', mais je suppose que la plupart des gens ne seront pas sur votre ordinateur,: P –

+0

Cela a en fait un bug lorsque 'bgImg.src' contient des caractères spéciaux comme guillemets simples et doubles et antislashs. Au lieu de cela, vous devriez faire "url (" '+ bgImg.src.replace ("\\", "\\\\"). Replace (' "',' \\" ') +' ") ';' . Je pense que cela devrait échapper à toute url correctement. –

3

Attribuez la classe à une div avec visibility:hidden lors du chargement de la page initiale. De cette façon, il sera déjà dans le cache du navigateur lorsque vous affectez la classe à votre cellule de tableau.

2

This article may help you. Section pertinente:

// Once the document is loaded, check to see if the 
// image has loaded. 
$(
    function(){ 
     var jImg = $("img:first"); 

     // Alert the image "complete" flag using the 
     // attr() method as well as the DOM property. 
     alert(
      "attr(): " + 
      jImg.attr("complete") + "\n\n" + 

      ".complete: " + 
      jImg[ 0 ].complete + "\n\n" + 

      "getAttribute(): " + 
      jImg[ 0 ].getAttribute("complete") 
     ); 
    } 
); 

Sélectionnez essentiellement l'image de fond et vérifiez qu'elle est chargée.

+0

Je ne pense pas que cela puisse être fait lorsque l'état initial de l'arrière-plan est display: none; – thedp

3

@Jamie Dixon - il n'a pas dit qu'il voulait faire quoi que ce soit avec l'image d'arrière-plan, il suffit de savoir quand il est chargé ...

$(function() 
{ 
    var a = new Image; 
    a.onload = function(){ /* do whatever */ }; 
    a.src = $('body').css('background-image'); 
}); 
+0

Cela fonctionnera-t-il si l'élément sur lequel j'ai appliqué l'arrière-plan a la propriété - display: none; ? – thedp

+0

oui, pour autant que je sache, cela n'a pas d'importance, c'est juste saisir les règles de style et forcer l'image à précharger (essentiellement), quand cela est fait, le préchargement déclenche un événement onLoad. Cependant, vous ne voulez pas faire cela si vous voulez charger une image volumineuse (car cela peut ralentir les choses) –

+0

J'ai des problèmes pour le faire fonctionner. Voici mon style: background-image: url ('../ Images/bg/xxx.jpg'); Le a.src me donne l'emplacement de l'image avec l'url (''); Il semble que le onLoad n'est jamais déclenché. (J'ai également essayé onload) – thedp

0

Vous pouvez également fournir une fonction qui remplace simplement la balise img par le div/background afin que vous bénéficiez à la fois de l'attribut onload et de la flexibilité du div. Bien sûr, vous pouvez affiner le code pour répondre au mieux à vos besoins, mais dans mon cas, je m'assure également que la largeur ou la hauteur est préservée pour un meilleur contrôle de ce que j'attends.

Mon code comme suit:

<img src="imageToLoad.jpg" onload="imageLoadedTurnItAsDivBackground($(this), true, '')"> 

<style> 
.img-to-div { 
    background-size: contain; 
} 
</style> 

<script> 
// Background Image Loaded 
function imageLoadedTurnItAsDivBackground(tag, preserveHeight, appendHtml) { 

    // Make sure parameters are all ok 
    if (!tag || !tag.length) return; 
    const w = tag.width(); 
    const h = tag.height(); 

    if (!w || !h) return; 

    // Preserve height or width in addition to the image ratio 
    if (preserveHeight) { 
     const r = h/w; 
     tag.css('width', w * r); 
    } 
    else { 
     const r = w/h; 
     tag.css('height', h * r); 
    } 
    const src = tag.attr('src'); 

    // Make the img disappear (one could animate stuff) 
    tag.css('display', 'none'); 

    // Add the div, potentially adding extra HTML inside the div 
    tag.after(` 
     <div class="img-to-div" style="background-image: url(${src}); width: ${w}px; height:${h}px">${appendHtml}</div> 
    `); 

    // Finally remove the original img, turned useless now 
    tag.remove(); 
} 
</script>