60 votes

JavaScript : Événements de chargement du DOM, séquence d'exécution et $(document).ready()

Je viens de réaliser que je n'ai pas les connaissances fondamentales de ce qui se passe exactement lorsqu'une page est chargée dans un navigateur.

Supposons que j'ai une structure comme celle-ci :

<head>

<script src="jquery.js" type="text/javascript"></script>
<script src="first.js" type="text/javascript"></script>
</head>
<body>
...
<script type="text/javascript" id="middle">
    // some more JS here...
</script>
...
<script src="last.js" type="text/javascript"></script>
</body>

Voici les questions que je me pose :

  1. Dans quel ordre les choses se passent-elles ? On exécute d'abord le DOM puis le JS, est-ce l'inverse, ou est-ce simultané (ou dès que les fichiers JS finissent de se télécharger, sans tenir compte du DOM) ? Je sais que les scripts sont chargés dans l'ordre.

  2. Où se trouve $(document).ready() s'intégrer ? Dans l'onglet Net de Firebug, je vois DOMContentLoaded et l'événement load événement. Est-ce que $(document).ready() déclenché lorsque le DOMContentLoaded se déclenche ? Je n'ai pas trouvé d'informations concrètes à ce sujet (tout le monde se contente de mentionner "lorsque le DOM est chargé").

  3. Que signifie exactement "lorsque le DOM est chargé" ? Que tout le HTML/JS a été téléchargé et analysé par le navigateur ? Ou seulement le HTML ?

  4. Le scénario suivant est-il possible : il y a un $(document).ready() qui appelle le code dans last.js mais s'exécute avant que last.js ne soit chargé ? Où se trouverait-il le plus probablement (dans first.js ou le bloc de code en ligne) ? Comment puis-je éviter ce scénario ?

Je veux comprendre le tableau d'ensemble de ce qui se passe quand et de ce qui dépend de quoi (le cas échéant).

37voto

Eevee Points 18333

Le Javascript est exécuté comme il est vu. Habituellement le navigateur arrête d'analyser la page dès qu'il voit un élément <script> télécharge et exécute le script, puis continue. C'est pourquoi il est communément conseillé de mettre <script> en bas : ainsi, l'utilisateur n'a pas une page blanche pendant que le navigateur attend que les scripts soient téléchargés.

Cependant, à partir de Firefox 3.5, les scripts sont téléchargés en arrière-plan pendant que le reste de la page est rendu. Dans l'éventualité désormais inhabituelle où le scripts utilise document.write ou similaire, Firefox fera marche arrière et redessinera si nécessaire. Je ne pense pas que d'autres navigateurs le fassent pour l'instant, mais je ne serais pas surpris si c'était le cas prochainement, et IE supporte au moins une fonction defer dans le <script> qui reportera le chargement du script après le chargement de la page.

DOMContentLoaded est exactement cela : il se déclenche dès que le DOM est chargé. C'est-à-dire, dès que le navigateur a analysé tout le HTML et en a créé un arbre en interne. Il n'attend PAS que les images, les CSS, etc. soient chargées. Le DOM est tout ce dont vous avez généralement besoin pour exécuter tout Javascript que vous voulez, il est donc agréable de ne pas avoir à attendre d'autres ressources. Cependant, je crois que seul Firefox supporte DOMContentLoaded ; dans d'autres navigateurs, ready() va simplement attacher un événement à l'ancienne onload .

Il est garanti que le Javascript s'exécute dans l'ordre où il apparaît dans votre HTML. Assurez-vous donc que votre fonction est définie avant d'essayer de l'attacher à un événement.

7voto

Zoidberg Points 5656
  1. Tous les script sont inclus dans l'ordre où ils apparaissent dans le html, ils sont chargés lorsque le html est analysé.
  2. Cela signifie que TOUS les objets dom ont été chargés, et que tous incluent scripts et css. (Les images peut-être pas encore).
  3. voir 2.
  4. $(document).ready() n'est appelé qu'une fois que tous les scripts et objets dom sont chargés, tout devrait bien se passer.

4voto

Niko Points 2289

http://javascript.about.com/od/hintsandtips/a/exeorder.htm devrait vous aider à répondre à cette question

en gros : d'abord toutes les données sont chargées (le html), puis le js le code à l'intérieur du head/body qui n'est pas dans une fonction ou ready ou quelque chose comme ça est exécuté en premier. à partir de là, il passe aux scripts séquentiellement.

Il est important de noter que les js ont la priorité sur le chargement des css, donc pour des raisons de performances, les js doivent être placés en bas de la page.

donc @4 : vous n'avez pas besoin d'empêcher ce scénario car first.js est toujours lu/exécuté avant last.js

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X