Comment charger le contenu d'un script dynamique dans le head ?

Pour toutes les discussions javascript, jQuery et autres frameworks
Jpe54
Messages : 68
Enregistré le : 10 mars 2017, 14:11

Comment charger le contenu d'un script dynamique dans le head ?

Message par Jpe54 » 18 oct. 2024, 13:41

Bonjour à tous,

Chargement du contenu d'un script "dynamique" dans le head d'un fichier.

Erreur en console avec laquelle je bataille, en outre l'argument reste undefined dans l'URL du script alors qu'il est véhiculé !
Uncaught TypeError: Cannot read properties of null (reading 'classList') at HTMLDocument.onDocumentLoad (VM6:647:19)
Amitiés,

Code fichier "000 Test.html"

Code : Tout sélectionner

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8" />
        <title>Demande fichier HTML 18/10/2024</title>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script>
            function updateScript() {
                let date = new Date();
                // Formater le mois pour qu'il ait toujours deux chiffres
                let month = (date.getMonth() + 1).toString().padStart(2, "0");
                // Demander à l'utilisateur le nouveau chemin du fichier, avec le chemin actuel comme valeur par défaut
                let newSel = prompt("slectionner année et mois de l'albumHTML :", date.getFullYear() + "-" + month);
                // Pour ouverture directe dans arborescence de menuW3C.htm
                self.location.href = "001 Test?" + newSel + ".htm";
            }
        </script>
    </head>
    <body>
        <button onclick="updateScript()">AlbumHTML Concerné :</button>
    </body>
</html>
Code fichier "001 Test.html"

Code : Tout sélectionner

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8" />
        <title>Fichier HTML à charger 18/10/2024</title>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <!-- ============================================================================== -->
        <!-- ==   Chargement fichier POIs_Tout_GPX.js contenant une base de coordonnées  == -->
        <!-- ============================================================================== -->
        <!-- <script src="../CD Vacances 2024-06/AlbumHTML/POIs_Tout_GPX.js"></script> -->
        <!-- ============================================================================== -->
        <!-- ============================================================================== -->
        <script>
            // Créer un script dynamique dans head fonction d'un argument dans l'Url
            function ExtraireParam() {
                url = window.location.href;
                var exp = new RegExp("[&?]+", "g");
                var exp2 = new RegExp("[=]+", "g");
                var tabNom = url.split(exp);
                var tabParam = new Array();
                if (tabNom != null) {
                    for (var i = 1; i < tabNom.length; i++) {
                        var tabTemp = tabNom[i].split(exp2);
                        tabParam[tabTemp[0]] = tabTemp[1];
                    }
                }
                return tabParam;
            }
            // Appel de la fonction et création du tableau des paramètres
            let MyUrl = "";
            var urlParam = ExtraireParam();
            // Récupérer répertoire et informations voulues dans parametre des url
			// Attendu date AAAA-MM exemple 2024-10 ou autre
            MyUrl = urlParam["TraceGPX"];

            if (MyUrl === null || MyUrl === undefined) {
				// self.location.href = "000 Test.htm";
				// Test provisoire à défaut de revenir sur fichier 000 Test.htm
                MyUrl = "2024-06";
            }

            // Créer dynamiquement le script avec le chemin correct
            document.addEventListener("DOMContentLoaded", function () {
                let script = document.createElement("script");
                script.id = "MaCarte";
                script.src = "../CD Vacances " + MyUrl + "/AlbumHTML/POIs_Tout_GPX.js";
                // Ajoutez un écouteur d'événements pour vérifier quand le script est chargé
                script.onload = function () {
                    let element = document.querySelector("#MaCarte"); // Remplacez par votre sélecteur
                    if (element) {
					// Ajoutez la classe sans le # malgré id
                        element.classList.add("MaCarte"); 
                    } else {
                        console.error("L'élément cible n'existe pas.");
                    }
                };
                document.head.appendChild(script);
            });
        </script>
    </head>
    <body>
        <script>
            // ...
			let fen = document.getElementsByTagName("html")[0];
            console.log("Résolution Ecran : " + fen.clientWidth + "x" + fen.clientHeight);
        </script>
    </body>
</html>
Fichiers HTML :
000 et 001 Test.zip
(1.92 Kio) Téléchargé 6537 fois

Avatar du membre
webmaster
Administrateur du site
Messages : 616
Enregistré le : 28 févr. 2017, 15:19

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par webmaster » 19 oct. 2024, 12:19

Bonjour

Il semble qu'il manque le fichier POIs_Tout_GPX.js pour pouvoir tester
TJS : 25 ans et mon livre Tout JavaScript chez Dunod
https://www.toutjavascript.com/livre/index.php

Jpe54
Messages : 68
Enregistré le : 10 mars 2017, 14:11

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par Jpe54 » 20 oct. 2024, 11:11

Bonjour,

Merci de l'intérêt que vous me portez !

Voici un fichier zip qui contient une structure complète incluant "POIs_Tout_GPX.js ". Les seules modifications de code sont :
1- le niveau de chemin d'accès à "POIs_Tout_GPX.js"
2- dans 000 Test.htm ajout de l'argument TraceGPX qui était absent > self.location.href = "001 Test?TraceGPX=" + newSel + ".htm";

000 Test (index).htm est le point de départ pour appeler et charger 001 Test.htm avec le codage DOM.
L'erreur console est toujours présente en codage DOM.

001 Test OK.htm est autonome avec le codage classic du script.

Amitiés,

Jean-Paul

Structure complète :
Pour Test.zip
(54.26 Kio) Téléchargé 8481 fois

Avatar du membre
webmaster
Administrateur du site
Messages : 616
Enregistré le : 28 févr. 2017, 15:19

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par webmaster » 21 oct. 2024, 08:54

Bonjour

De ce que je comprends de l'erreur c'est que trk n'est pas définie
Et comme trk est définie dans <script src="CD Vacances 2024-06/AlbumHTML/POIs_Tout_GPX.js"></script>
il faut que le fichier .js soit chargé
Hors il est en commentaire dans 001 test.htm
TJS : 25 ans et mon livre Tout JavaScript chez Dunod
https://www.toutjavascript.com/livre/index.php

Jpe54
Messages : 68
Enregistré le : 10 mars 2017, 14:11

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par Jpe54 » 21 oct. 2024, 13:48

Bonjour,

Le fichier "POIs_Tout_GPX.js" à charger contient bien la déclaration trk et se charge correctement avec un script "classique" dans head comme l'atteste la console dans "001 Test Ok.htm"

2 console.log depuis ce fichier :

Code : Tout sélectionner

getColor(5) : blueviolet
001 Test (OK).htm:69 trk[0] : 44.30553,4.75106,44.30599,4.75095,44.3063.... etc
Suite informations présentes au début de "POIs_Tout_GPX.js"

Code : Tout sélectionner

// ==============================================================================================
// Variables GPX TrackPoint pour traces dans openStreetMap
// Version v3.05 10/07/2024 (JpE)
// ==============================================================================================

// Liste de couleur d'affichage Traces et Control.Layer
function getColor(n) {
return n == 0 ? 'red' :
n == 1 ? 'blue' :
n == 2 ? 'fuchsia' :
n == 3 ? 'olive' :
n == 4 ? 'magenta' :
n == 5 ? 'blueviolet' :
n == 6 ? 'deepPink' :
n == 7 ? 'maroon' :
n == 8 ? 'orange' :
'black';
};

var DateGPX = [];
var DateGPX_D = [];
var FileGPX = [];
var trk = [];
var Duration_GPX = [];
// ==============================================================================================

DateGPX[0] = "2024-06-28";
DateGPX_D[0] ="2024-06-28T07:12:24Z";
trk[0] = [[44.305530,4.751060],[44.305990,4.750950], .... etc ....];
Aucune détection d'erreur de chargement en ajoutant :

Code : Tout sélectionner

    script.onerror = function () {
        console.error("Script non chargé.");
    };
Y aurait-il une dépréciation de ce codage ?

Code : Tout sélectionner

// Ajoutez une classe sans # malgré id !!!
element.classList.add("MaCarte");
Amitiés

Avatar du membre
webmaster
Administrateur du site
Messages : 616
Enregistré le : 28 févr. 2017, 15:19

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par webmaster » 22 oct. 2024, 10:59

Il y a un truc qui m'échappe dans le probleme
Je n'ai pas d'erreur dans testOK.htm
Juste des logs mais rien à l'écran
001 Test (OK).htm:67 Résolution Ecran : 1792x1300
10:58:31.966 001 Test (OK).htm:68 trk[0] :

C'est sensé faire quoi ?
TJS : 25 ans et mon livre Tout JavaScript chez Dunod
https://www.toutjavascript.com/livre/index.php

Jpe54
Messages : 68
Enregistré le : 10 mars 2017, 14:11

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par Jpe54 » 22 oct. 2024, 15:50

En fait je charge une page qui affiche une carte et une liste de case à cocher de dates (trk) - pour la trace de la virée - et une dernière permettant d'afficher ses WayPoint (wpt).

Par souci de clarté le code de cette portion ne figure pas dans les fichiers joints.

Chaque fichier "POIs_Tout_GPX.js" à charger contient une function pour les marqueurs, des variables et les bases de coordonnées qui évoluent au fil des années / mois pour afficher les traces et les points d'intérêt :

2023 > CD Vacances 2023-04/AlbumHTML/POIs_Tout_GPX.js",
2023 > CD Vacances 2023-09/AlbumHTML/POIs_Tout_GPX.js"

2024 > CD Vacances 2024-06/AlbumHTML/POIs_Tout_GPX.js"
etc...

Actuellement tout fonctionne correctement avec un codage classique de la page HTML dans un head de cette sorte :

Code : Tout sélectionner

<script src="CD Vacances 2024-06/AlbumHTML/POIs_Tout_GPX.js"></script>
Le fichier "001 Test OK.htm" est présent pour reproduire ce fonctionnement prouver que le chargement de POIs_Tout_GPX est effectif et pourra être utilisé comme l'atteste :
console.log("getColor(5) : " + getColor(5));
console.log("trk[0] : " + trk[0]);

+=+=+=+=+=+

Plutôt que de créer autant de fichier que d'années et mois concernés je souhaite partir d'une demande de date (input ou select) puis charger en passant comme argument la date à ce fichier "001 Test OK.htm" actuel.

Il me faut donc intervenir - sauf erreur - en DOM pour que un script contenant une variable pour la date.

Code : Tout sélectionner

<script src="CD Vacances " + La date variable + " /AlbumHTML/POIs_Tout_GPX.js"></script>
Pour test ce fichier porte le nom "001 Test.htm" mais utilise le DOM.

+=+=+=+=+=+

Lancer "000 Test (index).htm" permet de choisir une date (2023-04 / 2023-09 / 2024-06)
La validation ouvre "001 Test.htm" en passant en argument la période choisie destinée à construire le chemin du fichier "POIs_Tout_GPX.js" à charger pour la suite...

Or ce codage DOM bloque tout avec ce message que je ne sais comment traiter, d'où mon intervention sur votre site :
Uncaught TypeError: Cannot read properties of null (reading 'classList') at HTMLDocument.onDocumentLoad (VM5:647:19) onDocumentLoad @ VM5:647
Voici le résultat de l'appel du fichier "001 Test.htm" avec l'argument 2024-06 en surlignage qui devrait insérer et charger de manière dynamique le script src="CD Vacances 2024-06/AlbumHTML/POIs_Tout_GPX.js"
Error.jpg
Error.jpg (82.08 Kio) Vu 45439 fois
De fait aucun chargement de POIs_Tout_GPX.js ne se fait ! aucune trace console.log("trk[0] : " + trk[0]); ou getColor(5) etc...

Avatar du membre
webmaster
Administrateur du site
Messages : 616
Enregistré le : 28 févr. 2017, 15:19

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par webmaster » 23 oct. 2024, 11:03

Ha ok,

J'ai vu cette erreur, cela vient de la fonction de recherche du fichier qui est inversée
il faut écrire

Code : Tout sélectionner

                self.location.href = "001 Test.htm?TraceGPX=" + newSel ;
TJS : 25 ans et mon livre Tout JavaScript chez Dunod
https://www.toutjavascript.com/livre/index.php

mattrife
Messages : 1
Enregistré le : 28 nov. 2024, 03:38

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par mattrife » 28 nov. 2024, 03:40

Avez-vous vérifié la console du navigateur pour détecter des messages d’erreur ou des avertissements spécifiques liés au chargement ou à l’exécution du script? Incredibox Colorbox Mustard

blockblastgame
Messages : 1
Enregistré le : 17 déc. 2024, 08:14

Re: Comment charger le contenu d'un script dynamique dans le head ?

Message par blockblastgame » 17 déc. 2024, 08:16

When loading dynamic scripts, be mindful of security issues (CORS, CSP) if the script comes Block Blast from an external source.

Répondre