cs_moonz
Messages postés6Date d'inscriptionvendredi 5 avril 2002StatutMembreDernière intervention24 avril 2002
-
21 avril 2002 à 19:49
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 janvier 2019
-
15 août 2009 à 10:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 janvier 2019 15 août 2009 à 10:23
Pas terrible l'idée de mettre le script inclus à la fin de l'élément BODY, notamment quand le script est sensé s'exécuter avant.
Je le mettrais plutôt à la fin de l'élément HEAD, qui devrait toujours être présent dans le DOM HTML, même s'il est vide car le code HTML source n'en contient pas, et même si le document HTML lui-même (non strictement conforme avec la norme HTML) ne contient pas d'élément BODY, si le navigateur est conforme avec le DOM HTML normalisé.
De plus un vrai include devrait pouvoir s'exécuter de façon synchrone avec la fonction include() du javascript lui-même.
Pour cela, il faudrait que le corps de la fonction Javascript utilisant include() soit lui-même modifié (via le DOM) afin que l'instruction include() elle-même soit remplacée directement par le contenu du fichier référencé. Cependant cela risque de ne pas marcher sur de nombreux navigateurs, car une fonction en cours d'exécution (déjà compilée) si elle peut être éventuellement modifiée, ne l'est qu'en créant une nouvelle instance de cette fonction qui sera liée dans le DOM, sans interrompre la fonction en cours qui ne sera pas modifiée, avec pour effet donc qu'en sortiede include() il manquera l'exécution du contenu inclus et incorporé dans le DOM.
La question n'est pas évidente, et c'est bien évidemment un manque du langage Javascript lui-même, qui ne permet pas de modifier l'instance de la fonction en cours d'éxécution ou plus exactement ici l'instance de la fonction parente qui a appelé la fonction include(): une fonction appelée ne peut pas modifier le code de la fonction du contexte parent (ce serait un très sérieux problème de sécurité difficile à isoler, d'autant que généralement la fonction parente en cours d'exécution est déjà compilée en code natif, et que la fonction appelée n'a pas accès directement à son source pour le modifier). La seule solution serait donc que include() ne soit pas vu en Javascript comme un appel de fonction Javascript, mais comme un mot-clé natif, pris en compte par le compilateur, et prenant en compte divers paramètres de sécurité entre l'appelant et l'appelé.
cs_moonz
Messages postés6Date d'inscriptionvendredi 5 avril 2002StatutMembreDernière intervention24 avril 2002 21 avril 2002 à 19:49
ce script ne sert que dans le cas où la page n'utilise pas les balises <script>...</script> (dans le cas de WSH par exemple), sinon tu peux utiliser l'attribut src. Avec ton exemple de setTimeout ca donne :
<script src="monfichier.js" language="JavaScript">
window.setTimeout('lafonctioncontenuedanslautrefichier()', 100);
</script>
J'ai mis 5 car ca vaut 0 dans le cas d'une page utilisant les balises <script>...</script> mais 10 dans le cas de WSH par exemple ou il n'y a pas de fichier "parent".
15 août 2009 à 10:23
Je le mettrais plutôt à la fin de l'élément HEAD, qui devrait toujours être présent dans le DOM HTML, même s'il est vide car le code HTML source n'en contient pas, et même si le document HTML lui-même (non strictement conforme avec la norme HTML) ne contient pas d'élément BODY, si le navigateur est conforme avec le DOM HTML normalisé.
De plus un vrai include devrait pouvoir s'exécuter de façon synchrone avec la fonction include() du javascript lui-même.
Pour cela, il faudrait que le corps de la fonction Javascript utilisant include() soit lui-même modifié (via le DOM) afin que l'instruction include() elle-même soit remplacée directement par le contenu du fichier référencé. Cependant cela risque de ne pas marcher sur de nombreux navigateurs, car une fonction en cours d'exécution (déjà compilée) si elle peut être éventuellement modifiée, ne l'est qu'en créant une nouvelle instance de cette fonction qui sera liée dans le DOM, sans interrompre la fonction en cours qui ne sera pas modifiée, avec pour effet donc qu'en sortiede include() il manquera l'exécution du contenu inclus et incorporé dans le DOM.
La question n'est pas évidente, et c'est bien évidemment un manque du langage Javascript lui-même, qui ne permet pas de modifier l'instance de la fonction en cours d'éxécution ou plus exactement ici l'instance de la fonction parente qui a appelé la fonction include(): une fonction appelée ne peut pas modifier le code de la fonction du contexte parent (ce serait un très sérieux problème de sécurité difficile à isoler, d'autant que généralement la fonction parente en cours d'exécution est déjà compilée en code natif, et que la fonction appelée n'a pas accès directement à son source pour le modifier). La seule solution serait donc que include() ne soit pas vu en Javascript comme un appel de fonction Javascript, mais comme un mot-clé natif, pris en compte par le compilateur, et prenant en compte divers paramètres de sécurité entre l'appelant et l'appelé.
21 avril 2002 à 19:49
<script src="monfichier.js" language="JavaScript">
window.setTimeout('lafonctioncontenuedanslautrefichier()', 100);
</script>
J'ai mis 5 car ca vaut 0 dans le cas d'une page utilisant les balises <script>...</script> mais 10 dans le cas de WSH par exemple ou il n'y a pas de fichier "parent".