2010-03-07 7 views

Respuesta

13

sí, tiene que esperar. En particular, no puede confiar en que jQuery(document).ready() se active antes de que otros scripts tengan la oportunidad de ejecutarse. ready se enlaza a DOMContentReady, readystatechanged o onload, lo que esté disponible.

La documentación indica que "en la mayoría de los casos, el script se puede ejecutar tan pronto como la jerarquía DOM se haya construido por completo". Tenga en cuenta que la única garantía de es que el DOM está listo cuando se activa este evento. No le garantiza nada más, porque simplemente no puede.

Esto, por ejemplo, no funcionará en IE, Firefox o cromo, brilliant.js se siempre llama antes de que el controlador de ready() tiene la oportunidad de ejecutar no importa cómo se barajan las etiquetas de script:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Test</title> 
    <script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.js" charset="utf-8" type="text/javascript" ></script> 
</head> 
<body> 
    <script type="text/javascript" > 
    // <![CDATA[ 
     alert("attaching event"); 
     $(document).ready(function() { alert("fired"); }); 
    // ]]> 
    </script> 
    <script type="text/javascript" src="brilliant.js" ></script> 
</body> 
</html> 

FYI, aquí está el código relevante de jQuery 1.4.2-: archivo

bindReady: function() { 
    if (readyBound) { 
     return; 
    } 

    readyBound = true; 

    // Catch cases where $(document).ready() is called after the 
    // browser event has already occurred. 
    if (document.readyState === "complete") { 
     return jQuery.ready(); 
    } 

    // Mozilla, Opera and webkit nightlies currently support this event 
    if (document.addEventListener) { 
     // Use the handy event callback 
     document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); 

     // A fallback to window.onload, that will always work 
     window.addEventListener("load", jQuery.ready, false); 

    // If IE event model is used 
    } else if (document.attachEvent) { 
     // ensure firing before onload, 
     // maybe late but safe also for iframes 
     document.attachEvent("onreadystatechange", DOMContentLoaded); 

     // A fallback to window.onload, that will always work 
     window.attachEvent("onload", jQuery.ready); 

     // If IE and not a frame 
     // continually check to see if the document is ready 
     var toplevel = false; 

     try { 
      toplevel = window.frameElement == null; 
     } catch(e) {} 

     if (document.documentElement.doScroll && toplevel) { 
      doScrollCheck(); 
     } 
    } 
}, 
+1

Por favor, comenten si deciden declinar. Gracias. –

2

Creo que $ (document) .ready() se ejecuta cuando el documento html se ha cargado y procesado. Lea la documentación para obtener más información

http://docs.jquery.com/Tutorials:Introducing_$(document).ready()

+0

'listo()' se ejecuta cuando John Resig decide que debe ejecutar. Se puede ejecutar en diferentes navegadores o incluso en diferentes versiones del mismo navegador en diferentes momentos. No puede confiar en que active su controlador de eventos antes de que otros scripts tengan la oportunidad de ejecutarse. Lo único que puedes decir con certeza es que puedes llegar al DOM cuando se dispara. –

2

la tercera parte js puede estar bloqueando, sobre todo si está en la etiqueta de la cabeza. Intente ponerlo justo antes de la etiqueta de cierre <body>.

Creo que la primera respuesta es incorrecta - document.ready no significa que todo el contenido debe cargarse, significa que el dom está completo. De lo contrario, los métodos jquery ejecutados dentro de esto no se ejecutarían hasta que se carguen todas las imágenes (por ejemplo), lo que no es cierto.

Editar

Parece que el comportamiento es diferente para las secuencias de comandos, pero puede ser específico del navegador. Hay una buena explicación aquí:

JavaScript: DOM load events, execution sequence, and $(document).ready()

+1

Según la documentación de Mozilla para el evento "DOMContentLoaded", la diferencia clave entre "listo" y "cargar" es que la página no espera que las imágenes se carguen antes de llamar a "listo" (es decir, el controlador "DOMContentLoaded" cuando está en Firefox o Webkit). No dice nada sobre los archivos de script que se están realizando.Dado que estamos hablando de un modelo de subproceso único, no veo cómo se podría llamar a los controladores "listos" mientras el navegador todavía estaba analizando/ejecutando un bloque '

  • 11. No se puede desplazar en UIScrollView tan pronto como UILabel/otra subvista agregada en Storyboard
  • 12. ¿Por qué jquery pierde memoria tan mal?
  • 13. jQuery.on() - cómo inicializar tan pronto como se hayan cargado los elementos
  • 14. ¿Cómo se pueden destruir las barreras tan pronto como devuelve pthread_barrier_wait?
  • 15. qué se cygwin tan lento
  • 16. ¿Por qué este jquery es tan lento?
  • 17. ¿Cuántas veces se llamará a strlen() en este ciclo for?
  • 18. jQuery IE se ha ido tan mal
  • 19. JQuery $ (documento) .ready ajax load
  • 20. jQuery $ (documento) .ready() no se activa
  • 21. Python Process no llamará a atexit
  • 22. ¿Cuándo __destruct no se llamará en PHP?
  • 23. jquery - ¿Es $ (documento) necesario?
  • 24. qué método se llamará cuando comencemos a girar el dispositivo y después de que haya finalizado
  • 25. ¿Por qué PyPy se traduce tan lento?
  • 26. Qt :: ¿Qué tan pequeño se puede hacer?
  • 27. ¿Cómo se puede usar jQuery para medir qué tan lejos se ha desplazado el usuario?
  • 28. FormsAuthenticationTicket caduca demasiado pronto
  • 29. ¿Qué tan bien se admite insertAdjacentHTML?
  • 30. ¿Qué tan malo es jQuery * inside * código de MooTools?