2009-12-18 12 views
19

que tienen la siguiente clase CSS¿Cómo se verificó la imagen de fondo (css)?

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

que estoy aplicando en una etiqueta TD.

Mi pregunta es ¿cómo puedo decir con JavaScript/jQuery que la imagen de fondo terminó de cargarse?

Gracias.

ACTUALIZACIÓN: propiedad de visualización agregada. Dado que mi objetivo principal es alternar a la vista.

Respuesta

32

La única manera que conozco de hacer esto es cargar la imagen usando Javascript, y luego configurar esa imagen como el fondo.

Por ejemplo:

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

Por alguna extraña razón el proceso de carga sólo se activa cuando el imageLocation realmente necesita algún tiempo para cargar, al igual que desde la web. No funciona en pruebas locales con 0 tiempo de carga. – thedp

+1

puede establecer un tiempo de espera para 'bgImg.src = imageLocation;', pero supongo que la mayoría de las personas no estarán en su computadora,: P –

+0

Esto realmente tiene un error cuando 'bgImg.src' contiene caracteres especiales como comillas simples y dobles y barras diagonales inversas. En su lugar, debe convertirlo en "url (" '+ bgImg.src.replace ("\\", "\\\\"). Replace (' "',' \\" ') +' ") ';' . Creo que debería escapar de cualquier url correctamente. –

3

Entregue la clase a un div con visibility:hidden en la carga de la página inicial. De esta forma, ya estará en la memoria caché del navegador cuando asigne la clase a su celda de la tabla.

2

This article may help you. Sección 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") 
     ); 
    } 
); 

Básicamente, seleccione la imagen de fondo y verifique que esté cargada.

+0

No creo que esto se pueda hacer cuando se muestra el estado inicial del fondo: ninguno; – thedp

3

@Jamie Dixon - que no dijo lo que quería hacer nada con la imagen de fondo, sólo sé cuando está cargada ...

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

Funcionará si el elemento sobre el que apliqué fondo tiene la propiedad - display: none; ? – thedp

+0

sí, por lo que yo sé, esto no importa, solo está tomando las reglas de estilo y obligando a la imagen a precargarse (esencialmente), cuando termina de precargarlo, desencadena un evento onLoad. , sin embargo, no desea hacer esto si desea cargar una imagen grande (porque puede ralentizar) –

+0

Tengo problemas para hacerlo funcionar. Aquí está mi estilo: background-image: url ('../ Images/bg/xxx.jpg'); La a.src me da la ubicación de la imagen con la url (''); Parece que el onLoad nunca se dispara. (También probé onload) – thedp

0

También puede proporcionar una función que simplemente reemplaza la etiqueta img por div/background para que se beneficie tanto del atributo onload como de la flexibilidad del div.

Por supuesto, puede ajustar el código que mejor se adapte a sus necesidades, pero en mi caso, también me aseguro de que se conserva el ancho o la altura para un mejor control de lo que espero.

Mi código de la siguiente manera:

<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> 
Cuestiones relacionadas