Comportement d'événement Javascript bizarre

Comportement d'événement Javascript bizarre - Javascript/Node.js - Programmation

Marsh Posté le 25-09-2023 à 17:39:21    

Bonjour,
Dans Mediawiki, on peut ajouter dans l'espace de nom "Mediawiki:" des Javascript (ex : "Mediawiki:MonScript.js" ). Ils sont exécutés lors du chargement de la page.
 
Pour synchroniser 2 scripts, je passe par un événement perso. Dans mon script Toto.js, j'ai mis :

Code :
  1. let MonEvent = new Event("MonScriptReady" );
  2. let bResult = document.dispatchEvent(MonEvent);


 
Dans mon 2ème script Titi.js, je veux démarrer son exécution quand Toto.js a terminé. J'ai donc mis :

Code :
  1. document.addEventListener("MonScriptReady", function(event) {
  2.  console.log("C'est bon, je peux démarrer..." );
  3. });


 
Ca marche de temps en temps mais pas systématiquement. :( Je ne comprends pas pourquoi. Est-ce que c'est mon code JS qui pose souci ?
 
Merci par avance pour votre aide :jap:


Message édité par rufo le 25-09-2023 à 17:39:56

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 25-09-2023 à 17:39:21   

Reply

Marsh Posté le 25-09-2023 à 20:05:45    

Aucune erreur dans la console ?
Je pensais (bêtement ^^) que ptet titi.js était parfois appelé avant toto.js...
Dans le doute tu devrais peut être tout mettre "encapsulé" dans des onload pour être sur que tout est là.
Après ça reste du bricolage, je suis sur que y'a une meilleur façon de faire. [:nedurb]


---------------
D3
Reply

Marsh Posté le 25-09-2023 à 21:03:20    

Non, pas de msg d'erreur dans la console. Ce qui est étonnant, c'est que lorsque ça fonctionne bien, le console.log() que j'ai mis après l'instruction document.dispatchEvent(MonEvent); dans Toto.js s'affiche APRES le console.log() qui est dans document.addEventListener("MonScriptReady", function(event) {...});
 
Pourtant, je trouvais que c'était une bonne idée d'utiliser un Event pour synchroniser mes 2 scripts. Y'a un truc que j'ai pas dû bien comprendre... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-09-2023 à 06:00:16    

Vu que tu dis que c'est au chargement, y a effectivement de bonnes chances pour que le dispatch soit fait avant que le listener ne s'y soit abonné.
 
Tu contrôles comment le démarrage de l'exécution, tu as une sorte de readyState / load / DOMContentLoaded ou machin du même genre ?
 
Tu n'as qu'un émetteur et un gestionnaire, pas d'abonnement multiple avec des cancel ?


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 28-09-2023 à 08:35:55    

est ce qu'i lest possible que l'event listener soit exécuté après que l'event ait été dispatched ?

 

en général, je fais un un event dispatcher + une variable globale pour faire ça


Message édité par flo850 le 28-09-2023 à 08:36:06

---------------

Reply

Marsh Posté le 28-09-2023 à 09:33:05    

Effectivement, ça pourrait être une piste le fait que le dispatch soit exécuté avant que le event listener soit mis en place. Je vais tester.
 
Là, j'ai trouvé une façon de faire qui marche pas mal : je fais un "include" du fichier qui contient la fonction que j'appelais sur le listener et dans le JS qui faisait le dispatch, je check si la fonction existe (donc que le include a bien été fait). Si oui, je l'exécute.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-09-2023 à 18:04:10    

Bon, je viens de tester avec une structure du genre :

Code :
  1. var PageLoaded = false;
  2.  
  3. if (document.readyState === "loading" ) {
  4.    document.addEventListener("DOMContentLoaded", (event) => {
  5.        if (!PageLoaded )
  6.        {
  7.            PageLoaded = true;
  8.            MonScriptLoad();
  9.        }
  10.    });
  11. }
  12. else
  13. {
  14.    if (!PageLoaded )
  15.    {
  16.        PageLoaded = true;
  17.        MonScriptLoad();    
  18.    }
  19. }


 
Et dans MonScriptLoad() je fais le traitement + le dispatchEvent().
 
Dans dans le script qui attend l'event :

Code :
  1. var PageLoaded = false;
  2.  
  3. if (document.readyState === "loading" ) {
  4.    document.addEventListener("DOMContentLoaded", (event) => {
  5.        if (!PageLoaded )
  6.        {
  7.            PageLoaded = true;
  8.            document.addEventListener("MonScriptReady", (event) => {
  9.               MonTrucAFaireSurEvent();    
  10.            });
  11.        }
  12.    });
  13. }
  14. else
  15. {
  16.    if (!PageLoaded )
  17.    {
  18.        PageLoaded = true;
  19.        document.addEventListener("MonScriptReady", (event) => {
  20.            MonTrucAFaireSurEvent();    
  21.        });    
  22.    }
  23. }


 
Ca a l'air de fonctionner :)


Message édité par rufo le 28-09-2023 à 18:05:07

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed