2009-08-25 33 views
221

Si tengo una gran cantidad de funciones en el arranque de lo que todos tienen que estar bajo una sola:

$(document).ready(function() { 

o puedo tener múltiples tales declaraciones?

+1

principales necesidades cuando necesito para cargar varios archivos JS ¿Dónde está cada uno contiene $ (document) .ready(); función – Abdillah

+0

@leora se formuló esta pregunta en una entrevista: D Gracias – Suresh

Respuesta

269

Puede tener varias, pero no siempre es lo más recomendable. Trate de no abusar de ellos, ya que afectará seriamente la legibilidad. Aparte de eso, es perfectamente legal. Ver el siguiente:

http://www.learningjquery.com/2006/09/multiple-document-ready

Trate de hacer esto:

$(document).ready(function() { 
    alert('Hello Tom!'); 
}); 

$(document).ready(function() { 
    alert('Hello Jeff!'); 
}); 

$(document).ready(function() { 
    alert('Hello Dexter!'); 
}); 

Usted encontrará que es equivalente a esto, tenga en cuenta el orden de ejecución:

$(document).ready(function() { 
    alert('Hello Tom!'); 
    alert('Hello Jeff!'); 
    alert('Hello Dexter!'); 
}); 

También vale la pena teniendo en cuenta que una función definida dentro de un bloque $(document).ready no se puede llamar desde otro bloque $(document).ready, acabo de ejecutar esta prueba:

$(document).ready(function() { 
    alert('hello1'); 
    function saySomething() { 
     alert('something'); 
    } 
    saySomething(); 

}); 
$(document).ready(function() { 
    alert('hello2'); 
    saySomething(); 
}); 

producción fue:

hello1 
something 
hello2 
+23

No es aconsejable confiar en el orden de ejecución cuando se usan múltiples declaraciones $ (documento) .ready(). Cada uno necesita ejecutar independientemente de cualquier otro que ya haya sido ejecutado o no. – James

+0

@AoP - No sé cuánto sentido tiene, si no se ejecutan en orden, entonces son completamente sin sentido dentro del contexto de la aplicación, por lo que el uso de múltiples $ (documento) .ready (los bloques se romperían por completo . – karim79

+7

@ karim79 seguramente esto (la pregunta del OP) es más aplicable cuando se escribe un código complicado con varias preocupaciones de inicio, es decir, algún código que * siempre * se ejecuta cuando se completa la carga, y algunos que solo se requieren en algunos nodos de contenido? En tal situación, el contexto debe estar aislado y el orden de ejecución debe ser inmaterial: poder asignar el evento 'DOM ready' sin sobreescribir el anterior se convierte en una característica útil, independientemente del comportamiento de ordenamiento. – tehwalrus

10

que es posible tener múltiples $ ready (documento)() llama. Sin embargo, no creo que puedas saber de qué manera serán ejecutados. (source)

+14

llamado en el orden agregado – redsquare

+0

@JW que no es la wiki de jQuery, eso es un blog. –

+0

@RegEdit: he arreglado el enlace. Como se podía ver en la URL, en 2009, había una página en la wiki de jQuery sobre esto. Aparentemente, esa URL ahora redirige a una publicación de blog. –

15

Sí, puede tener varios bloques fácilmente. Solo tenga cuidado con las dependencias entre ellos ya que el orden de evaluación puede no ser el esperado.

18

Puede usar múltiples. Pero también puede usar múltiples funciones dentro de un documento. También está listo:

$(document).ready(function() { 
    // Jquery 
    $('.hide').hide(); 
    $('.test').each(function() { 
     $(this).fadeIn(); 
    }); 

    // Reqular JS 
    function test(word) { 
     alert(word); 
    } 
    test('hello!'); 
}); 
+0

Esto está bien si tiene control total de el código adjunto a la página. Si alguien ya ha escrito esto en otro archivo adjunto a la página, entonces está bien que lo declare así. –

+0

No estoy seguro de lo que está tratando de decir. Pero si pones esto dentro de tu cabeza, e incluye otras 15 JS externas, todas las cuales contienen una (o varias), funcionarán como si hubiera una sola. Vale la pena mencionar que la primicia de cada función/variable finaliza con el corchete de cierre de $ (document) .ready-function. – Mickel

+2

Solo trato de decir que a veces, otras personas tendrán módulos escritos adjuntos a la página que ya tienen una función de documento listo, por lo que es posible que no tenga el lujo de mover todo su código en una función (que, concede, sería ideal). Sin embargo, también sería cauteloso de tener demasiadas cosas aquí, ya que obtendremos On Ready Bloating, que puede hacer que el código sea igual de difícil de mantener. –

2

Sí, puede.

Las secciones preparadas para múltiples documentos son particularmente útiles si tiene otros módulos activados en la misma página que lo utilizan. Con la antigua declaración window.onload=func, cada vez que especificaba una función para ser llamada, reemplazaba la antigua.

Ahora todas las funciones especificadas se ponen en cola/apilado (pueden confirmar a alguien?), Independientemente de la sección de documentar lista que se especifican en.

+0

Sí, es cierto, las funciones están puestas en cola más rápido que las funciones anteriores $ (documento) .ready. – Deeksy

5

Sí, es posible, pero se puede usar mejor un #mydiv div y usar ambas

$(document).ready(function(){}); 

//and 

$("#mydiv").ready(function(){}); 
+2

Una idea interesante, pero ¿por qué es mejor? – Tim

+2

No se admite el uso de un div. Si por algún motivo hace esto, lo hace bajo su propio riesgo: [El método .ready() solo se puede invocar en un objeto jQuery que coincida con el documento actual] (http://api.jquery.com/ready/) –

3

Sí, está perfectamente bien, pero evite hacerlo sin una razón. Por ejemplo, lo utilicé para declarar las reglas del sitio global por separado de las páginas individuales cuando mis archivos javascript se generaron dinámicamente, pero si sigues haciéndolo una y otra vez, será difícil de leer.

También no puede acceder a algunos métodos desde otra llamada jQuery(function(){}); por lo que es otra razón por la que no quiere hacer eso.

Con la antigua window.onload, aunque reemplazará la anterior cada vez que especificó una función.

0

Creo que la mejor manera de hacerlo es poner el interruptor en las funciones con nombre (Check this overflow for more on that subject). De esa manera puede llamarlos desde un único evento.

así:

function firstFunction() { 
    console.log("first"); 
} 

function secondFunction() { 
    console.log("second"); 
} 


function thirdFunction() { 
    console.log("third"); 
} 

De esta manera, es posible colocarlos en una sola función listo.

jQuery(document).on('ready', function(){ 
    firstFunction(); 
    secondFunction(); 
    thirdFunction(); 

});

de salida Esta voluntad lo siguiente a su console.log:

first 
second 
third 

esta manera se puede volver a utilizar las funciones para otros eventos.

jQuery(window).on('resize',function(){ 
    secondFunction(); 
}); 

Check this fiddle for working version

0

Es legal, pero a veces se produce 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 de preparación de documentos separadas para cada inicialización de las 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 Document Ready.

0

Incluso puede anidar funciones preparadas para documentos dentro de los archivos html incluidos. Aquí hay un ejemplo usando jQuery:

del archivo: test_main.html

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <script src="jquery-1.10.2.min.js"></script> 
</head> 

<body> 
    <div id="main-container"> 
     <h1>test_main.html</h1> 
    </div> 

<script> 
    $(document).ready(function() 
    { 
     console.log('test_main.html READY'); 
     $("#main-container").load("test_embed.html"); 
    }); 
</script> 

</body> 
</html> 

del archivo: test_embed.html

salida
<h1>test_embed.html</h1> 
<script> 
    $(document).ready(function() 
    { 
     console.log('test_embed.html READY'); 
    }); 
</script> 

Consola:

test_main.html READY      test_main.html:15 
test_embed.html READY      (program):4 

navegador muestra:

test_embed.html

0

También puede hacerlo de la siguiente manera:

<html> 
<head> 
<script src="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> 
<p id="test">This is a hidden paragraph.</p> 
<button id="hide">Click me to hide</button> 
<button id="show">Click me to show</button> 
</body> 

+0

¿Puedes describir cómo esta es diferente a las otras respuestas? –

+0

seguro: las respuestas anteriores mostraron el uso de múltiples funciones con nombre dentro de un único bloque .ready, o una única función sin nombre en el bloque .ready, con otra función nombrada fuera del bloque .ready. Encontré esta pregunta mientras investigaba si había una manera de tener varias funciones sin nombre dentro del bloque .Ready - No pude obtener la sintaxis correcta. Finalmente lo descubrí, y esperaba que publicando mi código de prueba ayudaría a otros a buscar la respuesta a la misma pregunta que tenía. – JEPrice

+0

Lo siento, quise decir en la pregunta. Hay un botón de edición en la parte inferior izquierda del cuadro de texto.Al describir por qué su solución es diferente/mejor, la respuesta es mucho mejor ya que el futuro lector puede comprender más rápidamente el "por qué". Gracias. –

Cuestiones relacionadas