Pouvez-vous avoir plusieurs $ (document) .ready (function () {…}); sections?

240

Si j'ai beaucoup de fonctions au démarrage, doivent-elles toutes être regroupées sous un seul:

$(document).ready(function() {

ou puis-je avoir plusieurs de ces déclarations?

leora
la source
1
Nécessaire principalement lorsque j'ai besoin de charger plusieurs fichiers js où chacun contient $ (document) .ready (); fonction
Abdillah
@leora cette question a été posée lors d'une interview: D Merci
eirenaios

Réponses:

288

Vous pouvez en avoir plusieurs, mais ce n'est pas toujours la chose la plus intéressante à faire. Essayez de ne pas en abuser, car cela affecterait sérieusement la lisibilité. A part ça, c'est parfaitement légal. Voir ci-dessous:

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

Essayez ceci:

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

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

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

Vous constaterez que c'est équivalent à cela, notez l'ordre d'exécution:

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

Il convient également de noter qu'une fonction définie dans un $(document).readybloc ne peut pas être appelée à partir d'un autre $(document).readybloc, je viens de lancer ce test:

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

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

la sortie était:

hello1
something
hello2
karim79
la source
25
Il n'est pas judicieux de se fier à l'ordre d'exécution lors de l'utilisation de plusieurs instructions $ (document) .ready (). Chacun doit s'exécuter indépendamment de tout autre ayant déjà été exécuté ou non.
James
@AoP - Je ne sais pas combien cela a du sens, s'ils ne sont pas exécutés dans l'ordre, alors ils sont complètement dénués de sens dans le contexte de l'application, donc utiliser plusieurs $ (document) .ready (les blocs seraient complètement cassés.
karim79
7
@ karim79 sûrement cela (la question de l'OP) est le plus applicable lors de l'écriture d'un bit de code compliqué avec de multiples problèmes de démarrage - c'est-à-dire du code qui est toujours exécuté lorsque le chargement est terminé, et qui n'est requis que sur certains nœuds de contenu? Dans une telle situation, le contexte doit être cloisonné et l'ordre d'exécution doit être immatériel - pouvoir attribuer à l'événement `` DOM ready '' sans écraser le précédent devient une fonctionnalité utile, quel que soit le comportement de commande.
tehwalrus
1
En ce qui concerne une fonction définie dans un bloc prêt qui ne peut pas être appelée à partir d'un autre bloc prêt - c'est vrai de la façon dont vous définissez la fonction, mais si vous la définissez plutôt comme saySomething = function () {}, vous pouvez l'appeler. Bizarre, non? jsfiddle.net/f56qsogm testez-le ici.
ferr
2
Je pense qu'il se comporte comme ça car il ajoute la fonction à l'objet window qui est accessible globalement. Sinon, il s'agit d'une fonction déclarative étendue localement à cette fonction prête.
2014
19

Vous pouvez en utiliser plusieurs. Mais vous pouvez également utiliser plusieurs fonctions dans un même document.

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

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});
Nickel
la source
C'est ok si vous avez le contrôle total du code attaché à la page. Si quelqu'un l'a déjà écrit dans un autre fichier joint à la page, vous pouvez le déclarer ainsi.
James Wiseman
Je ne sais pas ce que vous essayez de dire. Mais si vous mettez cela dans votre tête, et incluez 15 autres JS externes, tous ceux qui en contiennent un (ou plusieurs document.load) cela fonctionnera comme s'il n'y en avait qu'un. Il convient de mentionner que le scoop de chaque fonction / variable se termine par le crochet de fermeture de la fonction $ (document) .ready.
Mickel
2
J'essaie juste de dire que parfois, d'autres personnes auront des modules écrits attachés à la page qui ont déjà une fonction prête pour le document, donc vous pourriez ne pas avoir le luxe de déplacer tout votre code dans une seule fonction (ce qui, d'accord, serait idéal ). Je me méfierais également d'avoir trop de choses ici, car nous aurons On Ready Bloating, ce qui peut rendre le code tout aussi difficile à maintenir.
James Wiseman
1
Ah, maintenant je vous comprends. Ouais, je suis d'accord là-dessus. Je viens de donner un exemple pour prouver que c'est possible;)
Mickel
15

Oui, vous pouvez facilement avoir plusieurs blocs. Soyez juste prudent avec les dépendances entre eux car l'ordre d'évaluation pourrait ne pas être ce que vous attendez.

pjesi
la source
11

Oui, il est possible d'avoir plusieurs appels $ (document) .ready (). Cependant, je ne pense pas que vous puissiez savoir de quelle manière ils seront exécutés. (la source)

JW.
la source
14
appelé dans l'ordre ajouté
redsquare
Merci, il est bon de clarifier cela, car - malgré la sagesse générale sur le sujet - la page jQuery ready () ne dit pas vraiment si vous le pouvez ou non (au moment de la rédaction :)). Il fait cependant sorte de laisser entendre qu'il est OK, si vous lisez entre les lignes d'une phrase:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Modifier
3

Oui, c'est parfait, mais évitez de le faire sans raison. Par exemple, je l'ai utilisé pour déclarer des règles de site globales séparément des pages individuelles lorsque mes fichiers javascript ont été générés dynamiquement, mais si vous continuez à le faire encore et encore, cela sera difficile à lire.

De plus, vous ne pouvez pas accéder à certaines méthodes à partir d'un autre jQuery(function(){});appel, c'est une autre raison pour laquelle vous ne voulez pas faire cela.

Avec l'ancien, window.onloadvous remplacerez l'ancien à chaque fois que vous spécifiez une fonction.

Néo
la source
2

Oui, vous pouvez.

Les sections prêtes pour plusieurs documents sont particulièrement utiles si d'autres modules utilisant la même page l'utilisent. Avec l'ancienne window.onload=funcdéclaration, chaque fois que vous spécifiez une fonction à appeler, elle remplace l'ancienne.

Maintenant, toutes les fonctions spécifiées sont mises en file d'attente / empilées (quelqu'un peut-il confirmer?) Quelle que soit la section de document prêt dans laquelle elles sont spécifiées.

James Wiseman
la source
Oui, c'est vrai, les fonctions sont mises en file d'attente plutôt que de remplacer les fonctions $ (document) .ready précédentes.
Deeksy
2

Je pense que la meilleure façon de procéder est de passer à des fonctions nommées (vérifiez ce débordement pour en savoir plus à ce sujet) . De cette façon, vous pouvez les appeler à partir d'un seul événement.

Ainsi:

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

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


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

De cette façon, vous pouvez les charger dans une seule fonction prête.

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

});

Cela produira ce qui suit dans votre console.log:

first
second
third

De cette façon, vous pouvez réutiliser les fonctions pour d'autres événements.

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

Vérifiez ce violon pour la version de travail

Jelle Verzijden
la source
0

C'est légal, mais parfois cela provoque un comportement indésirable. À titre d'exemple, j'ai utilisé la bibliothèque MagicSuggest et ajouté deux entrées MagicSuggest dans une page de mon projet et utilisé des fonctions prêtes à séparer les documents pour chaque initialisation des entrées. La toute première initialisation d'entrée a fonctionné, mais pas la seconde et ne donnant également aucune erreur, la deuxième entrée ne s'est pas affichée. Donc, je recommande toujours d'utiliser une fonction Document Ready.

Nimantha Harshana Perera
la source
0

Vous pouvez même imbriquer des fonctions prêtes à documenter dans des fichiers html inclus. Voici un exemple utilisant jquery:

Fichier: 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>

Fichier: test_embed.html

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

Sortie console:

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

Le navigateur affiche:

test_embed.html

Tim
la source
0

Vous pouvez également le faire de la manière suivante:

<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>

les réponses précédentes montraient l'utilisation de plusieurs fonctions nommées à l'intérieur d'un seul bloc .ready, ou d'une seule fonction sans nom dans le bloc .ready, avec une autre fonction nommée à l'extérieur du bloc .ready. J'ai trouvé cette question en recherchant s'il y avait un moyen d'avoir plusieurs fonctions sans nom à l'intérieur du bloc .ready - je n'ai pas pu obtenir la syntaxe correcte. J'ai finalement compris et j'espérais qu'en publiant mon code de test, j'aiderais les autres à chercher la réponse à la même question que j'avais

JEPrice
la source
Pouvez-vous décrire en quoi cela diffère des autres réponses?
Stephen Rauch
bien sûr: les réponses précédentes montraient l'utilisation de plusieurs fonctions nommées à l'intérieur d'un seul bloc .ready, ou d'une seule fonction sans nom dans le bloc .ready, avec une autre fonction nommée à l'extérieur du bloc .ready. J'ai trouvé cette question en recherchant s'il y avait un moyen d'avoir plusieurs fonctions sans nom à l'intérieur du bloc .ready - je n'ai pas pu obtenir la syntaxe correcte. Je l'ai finalement compris et j'espérais qu'en publiant mon code de test, j'aiderais les autres à chercher la réponse à la même question que moi.
JEPrice
Désolé, je voulais dire dans la question. Il y a un bouton d'édition en bas à gauche de la zone de texte. Décrire pourquoi votre solution est différente / meilleure en fait une bien meilleure réponse car le futur lecteur pourra plus rapidement comprendre le «pourquoi». Merci.
Stephen Rauch