IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[DOM] chargement de script sequentiel


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [DOM] chargement de script sequentiel
    bonjour,

    j'ai deux fonctions (a() et b()) chacune définie dans son
    propre script (a.js et b.js).

    b() fait confiance à une variable globale positionnée par
    a() .... mais bien sûr a() n'a pas fini son travail quand
    b() se lance ...

    sans doute parce que a.js et b.js sont chargés en parallèle.

    d'où ma question: comment forcer un chargement séquentiel,
    ou mieux demander à b() d'attendre un signal émis par a() ?

    (positionner un drapeau dans a() et un while ( ! drapeau)
    dans b() ne me ravi pas ...)


    merci pour vos solutions :-)

  2. #2
    Membre confirmé Avatar de d-Rek
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 438
    Points : 455
    Points
    455
    Par défaut
    J'ai déjà inséré dynamiquement un JS dans mon head et effectivement, j'ai rencontré ton soucis d'avoir à disposition des fonctions du nouveau JS opérationnelles.

    J'ai écrit une fonction récursive qui teste toutes les secondes si la dernière fonction de mon nouveau JS est bien du type function.
    Mais j'avoue que c'est crado, si quelqu'un à une solution, je suis aussi prenneur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function loading(){
    	if(typeof(LastFunction)!='function'){
    		setTimeout(function(){loading();}, 1000); // Wainting the JS file is loaded
    	}else{
    		go();
    	}
    }
     
    // Dans l'autre fichier
    function LastFunction(){
     
    }

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    ne pas confondre "chargé" et "exécuté".

    Dans le page principale (qui fait l'include de a.js et b.js) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <head>
    <script type="text/javascript">
    window.onload = function () {
    a();
    b();
    }
    </script>
    </head>


    A+

  4. #4
    Membre confirmé Avatar de d-Rek
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 438
    Points : 455
    Points
    455
    Par défaut
    Ah ? J'ai mal compris..

  5. #5
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par zood Voir le message
    d'où ma question: comment forcer un chargement séquentiel,
    ou mieux demander à b() d'attendre un signal émis par a() ?
    Lier b() au windows.onload. Tu seras sur que le traitement fait par a() est terminé.

    Mieux encore, lier les deux au windows.onload :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    window.attachEvent('onload',function(){a();b();});
    (attention syntaxe IE / FFx différente).

    De façon générale, je ne fais jamais confiance au chargement des fichiers pour executer des méthodes, autres que lier des fonctions aux évenements.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par d-Rek Voir le message
    Ah ? J'ai mal compris..
    Je crois que non : c'est juste une autre méthode

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Frames, variables globales, et Code JS transversal
    Citation Envoyé par denisC Voir le message
    Lier b() au windows.onload. Tu seras sur que le traitement
    fait par a() est terminé.
    Mon pb est que a.js est que l'appli (pas taper) est dans 3
    frames .... on travaille sur de l'existant avec un historique
    un peu lourd ...

    et la difficulté est que b() se lance sous une frame mais
    utilise une variable globale définie au niveau de la page
    contenant les frames (main.html) ....

    c'est pour cela que j'imaginais une solution à base de
    drapeau, ou de signal attendu par b() mais envoyé par a().


    Mieux encore, lier les deux au windows.onload :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    window.attachEvent('onload',function(){a();b();});
    (attention syntaxe IE / FFx différente).
    oui, moi c'est addEventHandler() et je ferais mieux d'utiliser
    Prototype.js ... quand j'aurai réglé mon pb de Frames .. car
    évidemment je ne peux pas imaginer de charger la lib 3 fois
    dans 3 frames différentes /o\

    De façon générale, je ne fais jamais confiance au chargement
    des fichiers pour executer des méthodes, autres que lier des
    fonctions aux évenements.
    oui, c'est essentiellement ce que j'utilise pour lancer mes
    traitement: une function initPage() que je lie a l'evenement
    load.

    mais là ... je ne peux pas lancer b() au chargement de
    main.html, b() est définie et lancée dans frameB.js inclus
    par frameB.html mais utilise a() définie dans main.html ...

    Je sais que c'est un pb de design mais je cherche une
    solution temporaire avant le grand refactoring ;-)

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    T'as essayé de mettre la propriété defer des scripts à false ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut peut-on declarer ses propres evenements ?
    je reviens sur la question d'échange de signal

    la question est:
    "comment conditionner le chargement d'un script à la fin du
    chargement d'une page ?"

    mais la réponse ressemble à ce que j'utilise pour chacune
    de mes pages, à peine modifié:

    aujourd'hui j'ai

    framePage.html:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        <script type="text/javascript" src="js/loadFramePage.js"></script>
    et loadFramePage.js:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        function initPage() {
            patati patata;
            ......;
        }
     
        window.addEventListener("load", initPage, false);
    ce qui ne lance le code qu'à la fin du chargement de l'Html.

    à la place, si je veux ne lancer ce code qu'à la fin du
    chargement de mon main.html je peux plutôt mettre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        parent.window.addEventListener("load", initPage, false);

    Mais cela ne fonctionnera pas, car cet évènement load
    concerne l'html, pas le javascript ...

    d'où:

    peut-on déclarer des évènements ?

    dans loadMain.js j'aurai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        raise( Event(mySignal) );
    et dans loadFramePage.js:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        function initPage() {
            ...;
        }
        parent.window.addEventListener("mySignal", initPage, false);

    non ?

    Désolé pour la verbosité (et la confusion), et merci de votre patience ;-)

  10. #10
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Declencher des evenements personnalises
    Bon, je pense avoir trouvé un début de solution, exactement
    ce à quoi je pensais au début: déclencher un signal, en fait
    un 'event'.

    en résumé:
    une page Main.html qui contient des frames dont FramePage.html

    (attention, marche dans firefox/mozilla, DOM niveau 3)

    dans le loadMain.js (lié au load de Main.html ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
         // déclarer l'évènement
         var monEvent = document.createEvent("Events"); 
         monEvent.initEvent("MainOk", true, true); 
     
         // le passer à la frame concernée
         document.FramePage.dispatchEvent(monEvent);
    dans le loadFramePage.js

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        function initFramePage(){
            patati ptata;
            .
            .
            .
        }
        window.addEvenListener("MainOk", initFramePage, false);
    c'est en test, et tout n'est pas nickel mais c'est un début.
    (notamment que se passera-t-il si je reload juste la frame mais pas le Main.html ? je sais pas ...)

    je reste a l'ecoute de vos remarques.

    @+

    PS: la webographie

    http://javascript.developpez.com/faq...ment#fireEvent
    http://www.howtocreate.co.uk/tutoria...ript/domevents
    http://www.truerwords.net/articles/w...om_events.html
    http://www.w3.org/TR/2003/NOTE-DOM-L...07/events.html

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Chargement d'image avec progess bar
    Par seb.49 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 08/10/2007, 09h56
  2. [DOM] Chargement fichier xml
    Par dib258 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/08/2007, 11h03
  3. [DOM] Inclure un script
    Par pc.bertineau dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/06/2007, 14h16
  4. Chargement de script en fonction d'un champ
    Par toniodp dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/03/2007, 17h19
  5. [MySQL] problème de chargement de script
    Par Purple Haze dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 23/02/2007, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo