2012-05-17 12 views
32

El document.ready se usa para ejecutar código después de que el DOM esté completamente cargado. Esto se puede utilizar para adjuntar controladores de eventos a elementos de la página por ejemplo¿Este código debe estar en un documento. Listo?

$(function(){ 
    $('#somediv').click(function(){ 

    }); 
}) 

<div id="somediv"> </div> 

Internamente, jQuery conecta a DOMContentLoaded y window.onload como un repliegue. En el caso de IE an attempt is made to scroll the viewport over and over until successful .

Tengo algunas preguntas, la primera de las cuales, cuando se vinculan los controladores de eventos al document, ¿es necesario poner ese código en un document.ready? Siempre he estado escribiendo el código de abajo sin envolverlo en un document.ready

$(document).keydown(function(e){ 
    if (e.which == 39) { 
     alert("right arrow pressed"); 
     return false; 
    } 
}); 

Y como se puede ver, works. Según tengo entendido, dado que este código no se conecta con ningún elemento del documento, sino con el documento en sí, no es necesario ajustarlo en un controlador document.ready. Otra razón por la que no lo envuelvo es porque solía hacer lo mismo en vainilla javascript, el equivalente sería el siguiente código, que también es works.

document.onkeydown= function(){ 
var keyCode = event.keyCode || event.which; 
    if (keyCode == 39) { 
     alert("right arrow pressed"); 
     return false; 
    } 
} 

que he visto numerosos puestos donde la gente lo envuelven en una document.ready, ¿hay alguna desventaja de no envolver este código en document.ready?

También creo que esta pregunta se debe a mi falta de claridad de lo que sucede durante este tiempo cuando se está construyendo el DOM, por lo que si alguien puede explicar lo que sucede durante el período justo antes de que DOM esté listo. Para mí, el documento es listo cuando el html ha sido analizado y convertido en un árbol DOM, o hay más para él?

En resumen, aquí están mis preguntas

  1. Al enlazar controladores de eventos a la document sí mismo, es que necesario poner ese código en un document.ready.
  2. ¿Hay inconvenientes en no ajustar el código en el document.ready?
  3. ¿Qué secuencia de eventos tiene lugar cuando se está construyendo el documento, justo antes de que se active el document.ready?
+0

Oop. No delegación NM –

Respuesta

33

Si está vinculando al documento en sí, no necesita esperar hasta que esté listo. No debería haber inconvenientes para no envolverlo en document.ready en este caso.

document.ready se activa cuando el evento DOMReady se desencadena por el navegador, o cuando una prueba específica es exitosa para versiones de navegadores que no admiten el evento DOMReady.

Información adicional.(5/22/12)

La mayoría de los navegadores modernos implementar el evento DOMContentLoaded que dispara cuando todos los elementos definidos en el documento están listos para ser manipulado por el javascript. Otros navegadores confían en un bucle setTimeout que comprueba continuamente el estado de listo del documento o se une directamente al método onreadystateged del documento (tomado de jquery core). El documento en sí está listo para ser manipulado antes de que javascript sea ejecutado, por lo tanto, nunca tendrá que esperar para vincularlo directamente al documento.

Lo único que tenemos aquí es que si el código interactúa con otros elementos además del documento, existe la posibilidad de que el evento se desencadene en el documento antes de que esos elementos existan. Es muy poco probable que eso suceda, pero puede suceder. Si eso es algo que puede suceder con su código, entonces tiene sentido colocarlo dentro de $(document).ready() para evitar ese escenario. Su muestra no garantiza ser colocada dentro de $(document).ready().

5

El único inconveniente de no unirse a un evento para el documento en un bloque document.ready sería que será posible desencadenar el evento antes de que todo el contenido de la página se ha cargado, que puede no ser lo que quieres.

11

El objetivo de $(document).ready es ejecutar código después de que se haya analizado todo el documento.

Solo necesita utilizarlo si desea utilizar elementos que aún no existen.
(por ejemplo, si el script se encuentra en la <head>)

Si existen los elementos que ya está utilizando (ya sea porque son global o porque su <script> está por debajo de ellos), que no lo necesitan.

2

Al utilizar elementos o acciones a llamarlos (que se generará en DOM o no existen aún) es necesario utilizar $(document).ready

1

Además de las respuestas: Puede utilizar la mera función de jQuery vivo (en lugar de keydown, etc.) para estar libre de la situación 'los elementos DOM deben estar terminados'.

Así que la próxima debe funcionar correctamente:

$("#somediv").live('keydown', function(){ ... }); 

En este caso jQuery se une al evento cuando es posible. No tiene inconveniente en colocar todos los enlaces en una función (ready), sus enlaces pueden colocarse en partes independientes de su página HTML o archivos Javascript.

Por lo tanto, la respuesta del resultado es: no, no necesita colocar su código en document.ready cuando usa la función mencionada.

actualización

En las últimas versiones de jQuery (> = 1.7) utilizan on() función en lugar de live() debido a que el último se depricated. Por lo tanto, no es necesario colocar enlaces de eventos en ready().

+0

jQuery.live() está en desuso en las versiones posteriores de jQuery. Reemplazado con jQuery.on(), jQuery.off() y jQuery.one(). Por lo menos, es mejor usar jQuery.delegate(). Desde v1.7 por http://api.jquery.com/live/ – Silkster

+0

'$ (document) .live (" keydown ", fn)' es lo mismo que '$ (document, document) .keydown (fn) ', o' $ (documento) .keydown (fn) ' –

+0

@Silkster ¡Gracias por la información! – sergzach

4

Este evento se desencadena cuando la jerarquía DOM ha sido totalmente construida es decir, todos los activos tales como imágenes han sido completamente recibido.

Se preguntó:

  • Al enlazar controladores de eventos al propio documento, es necesario poner ese código en un document.ready?
    • Respuesta: No. Cuando se utiliza un código que se basa en el valor de las propiedades de estilo CSS, es importante hacer referencia a las hojas de estilo externas o incrustar elementos de estilo antes de hacer referencia al script en el que reside su código o justo antes del bloque document.ready().

  • ¿Hay algunas desventajas de no envolver el código en el document.ready?
    • Respuesta: No. Pero cuando tiene que crear elementos dentro de sus documentos mediante JavaScript, entonces debe esperar hasta que su DOM esté listo. Para esto, debe poner su código dentro del bloque document.ready().

  • Qué secuencia de eventos tienen lugar cuando se está construyendo el documento, justo antes de que se dispare el document.ready?
    • Respuesta: Antes de que se encienda document.ready, DOMContentLoaded ya está activado por el navegador.
+1

En realidad, no hay garantía de que todas las imágenes se hayan cargado cuando se desencadena el 'document.ready'. Es por eso que está el evento '.load'. Estoy de acuerdo con tus otras respuestas. –

+1

Sí, el evento 'load' se puede enviar a cualquier elemento cuando se carguen él y sus subelementos, por ejemplo' window.load() '. Pero si no quiere esperar a que se carguen las imágenes, debe colocar su código dentro de un controlador enviado al método '.ready()'. – Vishal

1

1. Al enlazar controladores de eventos al propio documento, es necesario poner ese código en un document.ready?

No. De hecho, los métodos 'on' para encuadernación en JQ pueden delegar en el documento para que pueda usarlos en cualquier momento en cualquier elemento de forma segura siempre que no se frenen muchas burbujas en elementos de contenedor con stopPropagation.

2. ¿Hay algún inconveniente al no ajustar el código en el documento? ¿Listo?

Solo que las secuencias de comandos en la cabeza pueden intentar presionar HTML que todavía no está allí. Lo opuesto es que HTML podría estar listo y obtener eventos del usuario antes que el documento. Vea los métodos 'on' o la 'delegación de eventos' de google para tener su pastel y comérselo también en lo que respecta a los eventos (la advertencia son las bibliotecas que usan stopPropagation estúpidamente). document.ready es principalmente una forma de estar seguro de que su código se activa cuando el HTML está listo para ser golpeado. No es necesario que el código caiga en la parte inferior de la etiqueta del cuerpo a menos que (tal vez) estés golpeando el cuerpo con algo.

3. ¿Qué secuencia de eventos tiene lugar cuando se está construyendo el documento, justo antes de que el documento esté listo?

En el momento en que se dispara el documento listo, se han analizado todas las etiquetas y se han establecido las dimensiones del diseño.No es necesario que las imágenes se hayan cargado por completo, y solo estoy adivinando, pero sospecho que el CSS que no afecta el diseño puede no tener efecto todavía en algunos navegadores. Un elemento se considera 'listo' cuando su etiqueta de cierre ha sido leída y ejecutada por el analizador HTML. JS en las etiquetas de scripts debe ser manejado por un intérprete antes de que el análisis HTML pueda continuar, por lo que tendemos a poner nuestro código en la parte inferior del documento hoy en día de todos modos, para un tiempo de carga percibido más rápido.

Cuestiones relacionadas