11548 sujets

JavaScript, DOM et API Web HTML5

bonjour à tous ,

J'aimerais quelques précisions sur le moment des chargements des scripts Js .

Que charge le navigateur exactement lorsqu'il rencontre un code javascript ?
Bon le document est chargé dans l'ordre d'apparition des instructions , mais comme je viens de lire , l'exécution des scripts fait partie du processus d'analyse Html et que ces scripts ne devraient pas manipuler des objets html qui n'ont pas ... encore été créé (corps du document entre <body> et </body>)!!

Egalement si j'ai tout bien compris de ce que j'ai lu ( en français hors texte) toute
exécution de script entraine l'arrêt de l'analyse du document (tel un document.write) ...

Il y a également la différence entre la définition et l'exécution des fonctions, et donc toutes fonctions dansun script ne peut etre invoquée si la (les) fonctions les définissant n'ont pas été chargée .!! ? (pas en français dans ma tête
Smiley murf ) ...

Tout çà fait que je ne sais plus trop ( l'ai-je déjà sûsse ? Smiley rolleyes ) comment optimiser le moment et l'endroit pour insérer son script ...!?

Est-ce que dans son code il faut commencer par mettre toutes les définitions de variables globales + les définitions de fonctions et seulement demander leurs exécutions dans des "fonctions d'appel" ??

bon cela fait un peu suite au post 'Lancer un script au démarrage ? ' dans cette même section ( etre ou ne pas etre inrusif !? Smiley lol )

Faut-il systématiquement tester l'existence d'un objet pour s'assurer qu'il a bien été enregistrer avant de l'invoquer ( if(true) { } ou bien try { } catch(e) { } )

En plus simple : de quoi Faut-il s'assurer pour que ses fonctions soit à coup sûr exécutée en possession de toutes les données dont elle a besoin ??

merci d'avance pour votre aide
Salut,

Je ne suis pas sûr d'avoir bien compris tes questions. Smiley smile

1/ La lecture des éléments <script> est bloquante pour le parseur des navigateurs, c'est-à-dire que pendant le navigateur lit et interprète le contenu de l'élément, il ne continue pas d'interpréter la suite du document.

2/ L'interprétation du contenu d'un élément <script> se fait par bloc (que le contenu soit dans l'élément ou dans un fichier externe). C'est ce comportement qui permet de définir une fonction à la fin d'un fichier et de l'appeler au début du même fichier.

En clair, après un élément <script>, tu es sûr que son contenu a été interprété, sauf en cas d'erreur (erreur de syntaxe, erreur HTTP en chargeant un fichier externe, ...).

Voilà, j'espère n'avoir pas dit trop de bêtises. Smiley cligne
p.... j'ai du mal avec cette langue française !! Smiley lol

je n'ai pas d'exemple concret , mais avant de pouvoir exécuter une fonction ou un script , il faut être sûr que toutes les propriétés et objets s'y rapportant sont bien enregistrées ...

Comment etre sur que le moteur javascript n'exécute pas une fonction avant d'avoir entièrement enregistré le document Html ( ou Svg Smiley rolleyes ) qui s'y rapporte ...


J'ai parfois le cas où ma page ne se "charge pas " jusqu'au bout et que si je ne clique pas sur l'onglet "arreter le chargement du document" de mon navigateur, elle sera toujours en train de chercher les codes qui lui manquent (je parle pas d'IE ... je l'ai pas Smiley cligne )
il ne m'affiche pourtant pas d'erroe ( genre object undefined ..)

ps : pas sûr que je sois plus clair
Smiley confus que précédemment .

edit : après quelques recherches, le "problème" se poserait (uniquement ? )lors d'appel à un gestionnaire d'évènement alors que le chargement du document contenant celui-ci n'est pas terminé et que toutes les fonctions ou objets nécessaire à son exécution n'ont pas encore été analysé (enregistré) ...

Dans le cas où par exemple une page affiche déjà des liens ou un formulaire et que les gestionnaires associés peuvent être ainsi invoqués avant que toutes les fonctions ne soient effectivement enregistrées ..

Pour reprendre les termes de Flanagan :
a écrit :

Le fait que les gestionnaires d'évènement peuvent être invoqués avant le chargement complet d'un document a deux conséquences importantes :
.... vous devez etre sûr que la fonction est définie losque le getionnaire l'appele
.... vous devez etre sûr que votre gestionnaire ne tente pas de manipuler des objet HTML ( ou SVG mais çà c'est moi qui le rajoute Smiley rolleyes ) qui n'ont pas encore été analysé ou créé


bon c'est très Logique .... mais comment en être sûr ... je ne peux pas mettre une alerte " eh oh tu peux pas attendre que le document soit chargé au lieu de cliquer comme un excité ...! Smiley fache " ...
çà ferait mauvais genre non !?
Modifié par kzone (26 Feb 2007 - 14:34)
salut kzone,

L'évenement body onload est justement là pour t'aider. Il se déclenche quand
le document est complètement chargé ainsi que les ressources externes qui
le compose.

C'est souvent sur cet évenement que sont liées les fonctions d'initialisation
qui travaillent sur le DOM.
... mais cela n'empêche pas le fait que je peux cliquer un lien de ma page html ( présent dans un formulaire par exemple ) pointant vers des scripts JS qui n'auront pas encore été chargé ( comme défini dans une fonction d'init de propriétés mon_objet.onclick = ma_fonction; )

Mais comme d'habitude je "chipote"
salut kzone,

Oui, c'est pourquoi il faudrait que le code html ne comporte aucun attribut événementiel.

par exemple: <input type='button' onclick='toto()' /> serait remplacé par
<input type='button' id='bouton_toto' />

et dans le script d'initialisation appelé sur l'événement onload de body tu assignes les événements

document.getElementById('bouton_toto').onclick = function() {...};

ainsi si tu clique avant l'initialisation, il ne se passe rien.
Salut,

Si le bouton n'est utile que lorsque JS est disponible, il est encore préférable de le générer à partir du code JS. Smiley smile