Necesario principalmente cuando necesito cargar múltiples archivos js donde cada uno contiene $ (document) .ready (); función
Abdillah
@leora se hizo esta pregunta en una entrevista: D Gracias
eirenaios
Respuestas:
288
Puede tener varios, pero no siempre es lo mejor. Trate de no usarlos en exceso, ya que afectará seriamente la legibilidad. Aparte de eso, es perfectamente legal. Ver lo siguiente:
También vale la pena señalar que una función definida dentro de un $(document).readybloque no se puede llamar desde otro $(document).readybloque, acabo de ejecutar esta prueba:
No es aconsejable confiar en el orden de ejecución cuando se utilizan varias declaraciones $ (document) .ready (). Cada uno necesita ejecutarse independientemente de cualquier otro que ya haya sido ejecutado o no.
James
@AoP: no sé cuánto sentido tiene eso, si no se ejecutan en orden, entonces no tienen sentido en el contexto de la aplicación, por lo que usar múltiples $ (document) .ready (los bloques se romperían por completo.
karim79
77
@ karim79 seguramente esto (la pregunta del OP) es más aplicable cuando se escribe un código complicado con múltiples preocupaciones de inicio, es decir, ¿algún código que siempre se ejecuta cuando se completa la carga y otro que solo se requiere en algunos nodos de contenido? En tal situación, el contexto debe estar aislado y el orden de ejecución debe ser irrelevante; poder asignar al evento 'DOM listo' sin sobrescribir el anterior se convierte en una característica útil, independientemente del comportamiento de orden.
tehwalrus
1
Con respecto a una función definida en un bloque listo que no se puede llamar desde otro bloque listo, esta es la forma en que define la función, pero si en su lugar la define como saySomething = function () {}, puede llamarla. Raro, verdad? jsfiddle.net/f56qsogm pruébalo aquí.
ferr
2
Creo que se comporta así porque está agregando la función al objeto de ventana que es accesible globalmente. De lo contrario, es una función declarativa con ámbito local para esa función preparada.
ferr
19
Puedes usar múltiples. Pero también puede usar múltiples funciones dentro de un documento.
Esto está bien si tiene el control total del código adjunto a la página. Si alguien ya ha escrito esto en otro archivo adjunto a la página, entonces está bien declararlo así.
James Wiseman el
No estoy seguro de lo que estás tratando de decir. Pero si pone esto dentro de su cabeza e incluye otros 15 JS externos, todos los cuales contienen uno (o carga de documentos múltiples), seguirá funcionando como si hubiera uno solo. Vale la pena mencionar que la primicia de cada función / variable termina con el corchete de cierre de la función $ (document) .ready.
Mickel
2
Solo tratando de decir que a veces, otras personas tendrán módulos escritos adjuntos a la página que tienen una función de documento listo ya declarada, por lo que es posible que no pueda darse el lujo de mover todo su código a una función (lo cual, concedido, sería ideal ) Sin embargo, también desconfiaría de tener demasiadas cosas aquí, ya que obtendremos On Ready Bloating, que puede hacer que el código sea igualmente difícil de mantener.
James Wiseman el
1
Ah, ahora te entiendo. Sí, estoy de acuerdo en eso. Solo mencioné un ejemplo para demostrar que es posible;)
Mickel
15
Sí, puedes tener fácilmente múltiples bloques. Solo tenga cuidado con las dependencias entre ellos, ya que el orden de evaluación podría no ser el esperado.
Gracias, es bueno dejar esto en claro, ya que, a pesar de la sabiduría general sobre el tema, la página jQuery ready () en realidad no dice si puede o no (al momento de escribir :)). Sin embargo, implica que está bien, si lees entre líneas de una oración:Ready handlers bound this way are executed after any bound by the other three methods above.
Edición
5
Sí, es posible, pero puede usar mejor un div #mydiv y usar ambos
Sí, está perfectamente bien. Pero evite hacerlo sin una razón. Por ejemplo, lo usé para declarar las reglas globales del sitio por separado que las páginas individuales cuando mis archivos javascript se generaron dinámicamente, pero si continúas haciéndolo una y otra vez, será difícil de leer.
Además, no puede acceder a algunos métodos desde otra
jQuery(function(){});llamada, así que esa es otra razón por la que no desea hacer eso.
Sin window.onloadembargo, con el viejo reemplazará el viejo cada vez que especifique una función.
Múltiples secciones preparadas para documentos son particularmente útiles si tiene otros módulos en la misma página que lo usan. Con la antigua window.onload=funcdeclaración, cada vez que especificaba una función a llamar, reemplazaba la antigua.
Ahora todas las funciones especificadas están en cola / apiladas (¿alguien puede confirmarlo?) Independientemente de la sección de documento listo en que se especifiquen.
Es legal, pero a veces causa un comportamiento no deseado. Como ejemplo, utilicé la biblioteca MagicSuggest y agregué dos entradas MagicSuggest en una página de mi proyecto y utilicé funciones separadas para documentos listos para cada inicialización de entradas. La primera inicialización de entrada funcionó, pero no la segunda y tampoco dio ningún error, la segunda entrada no apareció. Por lo tanto, siempre recomiendo usar una función de documento listo.
<html><head><scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script>
$(document).ready(function(){
$("#hide").click(function(){
$("#test").hide();});
$("#show").click(function(){
$("#test").show();});});</script></head><body><h2>This is a test of jQuery!</h2><pid="test">This is a hidden paragraph.</p><buttonid="hide">Click me to hide</button><buttonid="show">Click me to show</button></body>
las respuestas anteriores mostraban el uso de múltiples funciones con nombre dentro de un solo bloque .ready, o una sola función sin nombre en el bloque .ready, con otra función con nombre fuera del bloque .ready. Encontré esta pregunta mientras investigaba si había una manera de tener múltiples funciones sin nombre dentro del bloque .ready: no pude obtener la sintaxis correcta. Finalmente lo descubrí y esperé que al publicar mi código de prueba ayudaría a otros a buscar la respuesta a la misma pregunta que tenía
¿Puedes describir cómo esto es diferente a las otras respuestas?
Stephen Rauch
seguro: las respuestas anteriores mostraban el uso de múltiples funciones con nombre dentro de un solo bloque .ready, o una sola función sin nombre en el bloque .ready, con otra función con nombre fuera del bloque .ready. Encontré esta pregunta mientras investigaba si había una manera de tener múltiples funciones sin nombre dentro del bloque .ready: no pude obtener la sintaxis correcta. Finalmente lo descubrí y esperé que al publicar mi código de prueba ayudaría a otros a buscar la respuesta a la misma pregunta que tenía.
JEPrice 01 de
Lo siento, quise decir en la pregunta. Hay un botón de edición en la parte inferior izquierda del cuadro de texto. Describir por qué su solución es diferente / mejor la convierte en una respuesta mucho mejor ya que el futuro lector puede comprender más rápidamente el "Por qué". Gracias.
Respuestas:
Puede tener varios, pero no siempre es lo mejor. Trate de no usarlos en exceso, ya que afectará seriamente la legibilidad. Aparte de eso, es perfectamente legal. Ver lo siguiente:
http://www.learningjquery.com/2006/09/multiple-document-ready
Probar esto:
Encontrará que es equivalente a esto, tenga en cuenta el orden de ejecución:
También vale la pena señalar que una función definida dentro de un
$(document).ready
bloque no se puede llamar desde otro$(document).ready
bloque, acabo de ejecutar esta prueba:la salida fue:
fuente
Puedes usar múltiples. Pero también puede usar múltiples funciones dentro de un documento.
fuente
Sí, puedes tener fácilmente múltiples bloques. Solo tenga cuidado con las dependencias entre ellos, ya que el orden de evaluación podría no ser el esperado.
fuente
Sí , es posible tener múltiples llamadas $ (document) .ready (). Sin embargo, no creo que pueda saber de qué manera se ejecutarán. (fuente)
fuente
Ready handlers bound this way are executed after any bound by the other three methods above.
Sí, es posible, pero puede usar mejor un div #mydiv y usar ambos
fuente
Sí, está perfectamente bien. Pero evite hacerlo sin una razón. Por ejemplo, lo usé para declarar las reglas globales del sitio por separado que las páginas individuales cuando mis archivos javascript se generaron dinámicamente, pero si continúas haciéndolo una y otra vez, será difícil de leer.
Además, no puede acceder a algunos métodos desde otra
jQuery(function(){});
llamada, así que esa es otra razón por la que no desea hacer eso.Sin
window.onload
embargo, con el viejo reemplazará el viejo cada vez que especifique una función.fuente
Sí tu puedes.
Múltiples secciones preparadas para documentos son particularmente útiles si tiene otros módulos en la misma página que lo usan. Con la antigua
window.onload=func
declaración, cada vez que especificaba una función a llamar, reemplazaba la antigua.Ahora todas las funciones especificadas están en cola / apiladas (¿alguien puede confirmarlo?) Independientemente de la sección de documento listo en que se especifiquen.
fuente
Creo que la mejor manera de hacerlo es cambiar a funciones con nombre ( consulte este desbordamiento para obtener más información sobre ese tema) . De esa manera puedes llamarlos desde un solo evento.
Al igual que:
De esa manera, puede cargarlos en una sola función lista.
});
Esto generará lo siguiente en su console.log:
De esta manera puede reutilizar las funciones para otros eventos.
fuente
Es legal, pero a veces causa un comportamiento no deseado. Como ejemplo, utilicé la biblioteca MagicSuggest y agregué dos entradas MagicSuggest en una página de mi proyecto y utilicé funciones separadas para documentos listos para cada inicialización de entradas. La primera inicialización de entrada funcionó, pero no la segunda y tampoco dio ningún error, la segunda entrada no apareció. Por lo tanto, siempre recomiendo usar una función de documento listo.
fuente
Incluso puede anidar funciones listas para documentos dentro de los archivos html incluidos. Aquí hay un ejemplo usando jquery:
Archivo: test_main.html
Archivo: test_embed.html
Salida de consola:
El navegador muestra:
test_embed.html
fuente
También puedes hacerlo de la siguiente manera:
las respuestas anteriores mostraban el uso de múltiples funciones con nombre dentro de un solo bloque .ready, o una sola función sin nombre en el bloque .ready, con otra función con nombre fuera del bloque .ready. Encontré esta pregunta mientras investigaba si había una manera de tener múltiples funciones sin nombre dentro del bloque .ready: no pude obtener la sintaxis correcta. Finalmente lo descubrí y esperé que al publicar mi código de prueba ayudaría a otros a buscar la respuesta a la misma pregunta que tenía
fuente