2011-06-21 29 views
6

Tengo un script que puede cargarse en cualquier etapa del ciclo de vida de una página web. Cuando se carga el script, debe ejecutar un método initialize().Javascript: detectar cuando una ventana está completamente cargada

Quiero que esta función se ejecute en el evento "onload", pero no puedo estar seguro de que la página aún no se haya cargado, es decir, que "onload" no se haya activado.

Lo ideal sería que mi guión se vería así:

var _initialize = function() { ...}; 

if(window.LOADED) 
    _initialize(); 
else if (window.addEventListener) 
    window.addEventListener('load', _initialize, false); 
else if (window.attachEvent) 
    window.attachEvent('onload', _initialize); 

¿Existe tal window.LOADED o document.LOADED variable o algo similar?

Gracias de antemano, Shane

+1

¿Utiliza un marco js? jquery proporciona varias funciones excelentes para hacer esto fácilmente – JMax

+0

Consulte los comentarios en la publicación de @Balanivash – Shane

+0

No es la respuesta más simple para configurar una variable onload. Cuando su script se ejecuta, si la variable no está configurada, agregue un detector de onload para invocar el script. Si la variable está configurada, solo llame a la función. – RobG

Respuesta

3

Puede utilizar jQuery para hacer esto. $(document).ready(). Compruebe this

Simplemente llame a la función que desee dentro del listo. Entonces va a ser ejecutado una vez que el documento se ha cargado completamente

+0

No puedo :(. El método _initialize carga las dependencias del script, una de las cuales es jQuery. – Shane

+0

Puede tener jQuery solo fuera de la función y cargarlo junto con la página. – Balanivash

+0

Sí, pero al mismo Ahora puedo hacer esto con todas mis dependencias. Lo que realmente intento hacer es crear una secuencia de comandos independiente del recurso. Supongo que si todo llega a la conclusión, puedo suponer que jQuery estará allí, pero quiero evitar esto. – Shane

-2

puede utilizar

jQuery(document).ready(); 

al final de la página o justo antes de la etiqueta y se llamará mientras que su página web muestra en la máquina cliente y aproximadamente a la hora de finalización de la carga .....

1

Si no está utilizando cualquier biblioteca que podría hacer uso de este

function somelib(){ 
     this.readystate = false; //tracks the state of DOM 
     var nextcallfunc;  //stores the function to be called after DOM is loaded 

    //called by checkReady function when DOM is loaded completely 
     this.ready = function(func){ 
      // quit if this function has already been called 
      if (arguments.callee.done) return; 
      // flag this function so we don't do the same thing twice 
      arguments.callee.done = true; 
      this.readystate=true;  //make DOM load permanent 
      nextcallfunc.call();  //calls the onload handler 
    } 

    //Checks if the DOM has loaded or not 
    this.checkReady= function(func){ 
     /* for Mozilla/Opera9 */ 
     nextcallfunc = func; 

     if (document.addEventListener) { 
      document.addEventListener("DOMContentLoaded", this.ready , false); 
     } 
     /* for Internet Explorer */ 
     /*@cc_on @*/ 
     /*@if (@_win32) 
      document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>"); 
      var script = document.getElementById("__ie_onload"); 
      script.onreadystatechange = function() { 
      if (this.readyState == "complete") { 
       ready(func); // call the onload handler 
      } 
      }; 
     /*@end @*/ 

     /* for Safari */ 
     if (/WebKit/i.test(navigator.userAgent)) { // sniff 
      var _timer = setInterval(function() { 
      if (/loaded|complete/.test(document.readyState)) { 
       this.ready(); // call the onload handler 
      } 
      }, 10); 
     } 

     /* for other browsers */ 
     window.onload = this.ready; 
    } 

    } 

esto también resuelve problemas con el navegador cruz ..

0

Esto es lo que hago (escrito en CoffeeScript):

$(window).on 'load', -> 
    window._loaded = true 

window.on_window_load_safe = (callback) -> 
    if window._loaded 
    # Since the load even already happened, if we tried to add a new callback now, it would not even 
    # get called. So just call the callback immediately now. 
    callback.call() 
    else 
    $(window).on 'load', -> 
     callback.call() 

puede probarlo con algo como esto:

setTimeout(-> 
    on_window_load_safe -> 
     console.debug 'on_window_load_safe called me' 
    , 2000) 
Cuestiones relacionadas