2009-05-22 16 views
12

Tengo un script que se inserta dinámicamente a través de otro script. El código en esa secuencia de comandos está incluido en el evento $(window).load() porque requiere que todas las imágenes de la página se hayan cargado. En algunos navegadores funciona bien, pero en otros parece no dispararse porque la página ya ha terminado de cargarse para cuando se ejecuta el código.

¿Hay alguna manera de verificar y ver si la página ya ha terminado de cargarse, ya sea a través de jQuery o JavaScript? (Incluyendo imágenes)

En esta situación, no tengo acceso al evento onload del documento original (además de alterarlo a través del script cargado, pero parece que presenta el mismo problema).

¡Cualquier idea/solución/consejo sería muy apreciada!

Respuesta

7

Usted podría intentar la creación de un controlador que ha invocado a través de un tiempo de espera que se revisa las imágenes para ver si sus propiedades están disponibles. Borre el temporizador en el controlador de eventos load, de modo que si el evento de carga ocurre primero, el temporizador no se disparará. Si las propiedades no están disponibles, entonces el evento de carga aún no se ha activado y usted sabe que su manejador eventualmente será invocado. Si lo son, sabrá que el evento de carga ocurrió antes de que se haya configurado su controlador y simplemente puede continuar.

Pseudocódigo

var timer = null; 
$(function() { 
    $(window).load(function() { 
     if (timer) { 
      clearTimeout(timer); 
      timer = null; 
     } 
     process(); 
    }); 
    timer = setTimeout(function() { 
     if (checkAvailable()) 
      process(); 
     } 
    }, 10*1000); // waits 10 seconds before checking 
}); 

function checkAvailable() 
{ 
    var available = true; 
    $('img').each(function() { 
     try { 
      if (this.height == 0) { 
       available = false; 
       return false; 
      } 
     } 
     catch (e) { 
      available = false; 
      return false; 
     } 
     }); 
     return available; 
    } 

    function process() { 
     ... do the real work here 
    } 
+0

Esto es más o menos lo que estaba buscando hacer. Simplemente modifiqué un poco para disparar el temporizador a intervalos cortos en lugar de esperar 10 segundos. ¡Gracias! – DismissedAsDrone

2

Creo que su problema se resolvería si usara $ (documento) .Ready en lugar de $ (ventana) .load - vea el jquery documentation.

+0

sólo un fragmento de los documentos relacionados entre sí: En pocas palabras, este es un reemplazo sólido para usar window.onload ... su función enlazada se llamará th instantáneo e DOM está listo para ser leído y manipulado, que es cuando se debe ejecutar el 99.99% de todo el código de JavaScript. – TML

+5

$ (documento). Dispara si el DOM está en su lugar pero no espera a que las imágenes terminen de cargarse (si no me equivoco). En este caso, necesito que las imágenes se hayan cargado para que pueda leer sus atributos. – DismissedAsDrone

+1

Puede leer los atributos sin imágenes cargando ... – trusktr

5

escribí un plugin que puede ser de alguna utilidad: http://plugins.jquery.com/project/window-loaded

+0

¡Genial! Entonces, ¿funciona esto si uso .load() para obtener contenido, y si hay imágenes que necesitan cargarse, '' $ .windowLoaded (/ * dostuff * /) 'ejecutará la devolución de llamada luego de que se carguen nuevas imágenes ??? – trusktr

+0

Resolví el problema simplemente usando addEventListener para agregar funciones a window.onload y para cada llamada al método .load() de jquery estableciendo una variable en true para que se pueda detectar en adiciones posteriores a window.onload ... si eso hace cualquier sentido ... – trusktr

+0

El enlace está roto ahora, redirige al http://jquery.com/ :( – Septagram

Cuestiones relacionadas