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:
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:
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.
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.
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)
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
5
Oui c'est possible mais vous pouvez mieux utiliser un div #mydiv et utiliser les deux
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.
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.
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.
Vous pouvez également le faire de la manière suivante:
<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>
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
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.
Réponses:
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:
Vous constaterez que c'est équivalent à cela, notez l'ordre d'exécution:
Il convient également de noter qu'une fonction définie dans un
$(document).ready
bloc ne peut pas être appelée à partir d'un autre$(document).ready
bloc, je viens de lancer ce test:la sortie était:
la source
Vous pouvez en utiliser plusieurs. Mais vous pouvez également utiliser plusieurs fonctions dans un même document.
la source
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.
la source
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)
la source
Ready handlers bound this way are executed after any bound by the other three methods above.
Oui c'est possible mais vous pouvez mieux utiliser un div #mydiv et utiliser les deux
la source
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.onload
vous remplacerez l'ancien à chaque fois que vous spécifiez une fonction.la source
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=func
dé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.
la source
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:
De cette façon, vous pouvez les charger dans une seule fonction prête.
});
Cela produira ce qui suit dans votre console.log:
De cette façon, vous pouvez réutiliser les fonctions pour d'autres événements.
la source
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.
la source
Vous pouvez même imbriquer des fonctions prêtes à documenter dans des fichiers html inclus. Voici un exemple utilisant jquery:
Fichier: test_main.html
Fichier: test_embed.html
Sortie console:
Le navigateur affiche:
test_embed.html
la source
Vous pouvez également le faire de la manière suivante:
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
la source