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 :

surcharge du onload [FAQ]


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut surcharge du onload
    Salut !

    alors voila, j'ai ecrit un bout de code qui permet d'afficher une sorte de boite de dialogue (un div). Je veux que cette boite de dialogue s'ouvre au chargement de la page, donc j'ai surchargé l'evenement onload :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    onload = function() {mafonction()};
    Le probleme est que j'ai besoin d'intégrer ce bout de code dans des pages qui ont déjà une méthode sur le onload définie ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <body onload="fonctionInit();">
    Donc si je mets mon bout de code, la fonction fonctionInit() ne s'execute plus, normal.
    Dans mon code, j'ai récupéré la valeur du onload. Premier probleme, sous FireFox je récupère bien "fonctionInit();" alors que sous IE je récupère "function anonymous() {fonctionInit();}". A quoi sert ce anonymous ? Est il possible de ne pas l'avoir ?

    Le second probleme est que meme si j'arrive à récupérer juste "fonctionInit();", il faut ensuite que je l'affecte au onload avec ma fonction. Et je ne vois pas comment faire. Je voudrais un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    onload = function{ maFonction();+"la fonction que je récupère du onload"+};
    Est ce qu'il est possible de faire cela ? Y a t il une meilleure solution pour faire ce que je veux ?

    Merci d'avance
    Thomas

  2. #2
    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
    Oui, il y a une meilleure solution pour faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    element.addEventListener('load',mafonction,false); //pour FF
    element.attachEvent('onload',mafonction); //pour IE
    Cette syntaxe rajoute un event handler sur l'évenement onload de element (body ou window ou ce que tu utilises actuellement). Ca ne supprime pas les évenement qui était précedemment sur cet élément. Le soucis, comme tu l'as remarqué, c'est que la syntaxe est pas compatible FF/IE.

    Donc pour créer un event handler, il faut faire un filtre selon que le navigateur possède la fonction addEventListener ou non.

    Il y a également d'autre problèmes (le false qui apparait dans FF) mais à priori, pas besoin d'en parler pour le moment.

    Voila, sinon, en règle général, tu n'as pas besoin de créer une fonction si la fonction que tu utilises n'a pas d'argument.
    Typiquement:
    element.onload = function() {mafonction()};
    Est strictement equivalent à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    element.onload = mafonction;
    (Je sais pas si c'est un exemple ou si c'est tiré de ton code).

    Enfin, si IE te retourne
    function anonymous() {fonctionInit();}
    C'est simplement que la façon la plus simple pour lui de parser est de mettre la chaine de caractère présente dans le onload dans une fonction annonyme. Mais ça ne change rien su tout, la fonction reste la même que ta fonction initiale.

    Bonne chance

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    bah, pour faire simple, je te dirais d'appeler directement mafonction() en fin de body, sans gestionnaire d'événement; sauf s'il est nécessaire que fonctionInit() s'exécute un poil plus tôt;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut
    oui en effet, il y a plus simple que ce que je pensais faire...
    merci beaucoup

    ça fonctionne bien à part un petit truc. J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    window.attachEvent('onload', myThis.showDialogBox);
    et ça ne marche pas. myThis est un objet instancié plus haut.
    Par contre, si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    window.attachEvent('onload', attachedShowDialogBox);
     
    ...
     
    function attachedShowDialogBox() {
        myThis.showDialogBox();
    }
    là c'est bon.
    Est ce normal ?

    Thomas

  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
    oui, il faut mettre une fonction dans le attachEvent.

    Tu peux ecrire ça comme ça, avec une fonction anonyme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    window.attachEvent('onload', function(){myThis.showDialogBox()});
    C'est un peu compliqué pour lui de comprendre que c'est une méthode d'un objet...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut
    parfait ! ça marche !
    merci beaucoup pour ton aide.

  7. #7
    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
    pense au petit bouton


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

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/12/2003, 10h23
  2. Surcharge de fonction d'un edit dynamique
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/10/2003, 11h56
  3. Réponses: 5
    Dernier message: 24/04/2003, 11h47
  4. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  5. Réponses: 8
    Dernier message: 20/11/2002, 11h50

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