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 :

[Débutant] Exécution d'une fonction au chargement d'une autre fenêtre


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut [Débutant] Exécution d'une fonction au chargement d'une autre fenêtre
    Bonjour,

    Question peut-être un peu stupide, mais je bloque dessus depuis quelques temps...

    Voilà mon problème. Ma page HTML ne contient qu'un script js qui m'ouvre une nouvelle fenêtre de mon navigateur firefox (l'ouverture se passe très bien) et qui devrait m'afficher une petite fenêtre d'alerte au chargement de cette page. Seulement, aucun message n'apparaît...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <script type="text/javascript">
     var novoForm = window.open("https://www.monsite.com/page.php", "wFormx", "width=800,height=600,location=no,menubar=no,status=no,titilebar=no,resizable=no,");
     novoForm.onload = function(){
    	alert("Ce message ne devrait-il pas apparaitre ??") ;
     }
    </script>
    Quelqu'un aurait-il une idée du pourquoi le message n'apparaît pas ?

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bonsoir,

    chez moi ça marche. Regarde dans ta console (F12) s'il n'y a pas de message d'erreur ou indication quelconque.

    Il est possible que l'évènement load mette beaucoup de temps à se produire car il faut que toutes les ressources (scripts et styles, images, iframes, etc.) de la page soient chargées. Je te conseille d'utiliser plutôt DOMContentLoaded.

    Par ailleurs, tu trouveras de nombreuses informations quant à l'utilisation de window.open sur le MDN. Notamment, les raisons pour lesquelles tu devrais faire un test if (novoForm === null) pour éviter une erreur fatale (pointeur null) dans ton script.

    Demande toi aussi dans quelle fenêtre tu veux que l'alerte s'affiche. Il faut savoir que alert est une méthode de window. Implicitement, c'est l'objet window de la fenêtre parente qui est utilisé. Si tu veux que l'alerte s'affiche dans la popup, utilise novoForm.alert.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta réponse rapide !
    Alors le F12 console javascript ne donne rien pour la fenêtre fille novoForm, et juste une petite erreur dans la fenêtre mère :
    "L'encodage de caractères du document HTML n'a pas été déclaré. Le document sera affiché avec des caractères incorrects pour certaines configurations de navigateur si le document contient des caractères en dehors de la plage US-ASCII. L'encodage de caractères de la page doit être déclaré dans le document ou dans le protocole de transfert."
    J'ai corrigé ma page pour insérer le js dans une structure plus propre (html, head, body), l'erreur disparaît de la console, mais le comportement ne change pas...

    J'ai aussi rajouté un test sur novoForm, mais il n'est pas null.

    Pour la fenêtre cible du alert, c'est surtout un test pour vérifier que le code du onload est bien exécuté, donc si le message s'affiche dans l'une ou l'autre des fenêtres, ça m'ira très bien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
    <title>Page mere</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <script type="text/javascript">
     var novoForm = window.open("https://www.monsite.com/page.php", "wFormx", "width=800,height=600,location=no,menubar=no,status=no,titilebar=no,resizable=no,");
     if (novoForm == null)
    	 alert("novoForm nul");
     else{
    	novoForm.onload = function(){
    		alert("Ce message ne devrait-il pas apparaitre ??") ;
    		novoForm.alert("et ce message, ne devrait-il pas apparaitre ??") ;
    	}
    	//alert("on a passé le onload");
     }
    </script>
    </body>
    </html>
    Pour info, en décommentant le alert "on a passé le onload", le message apparaît bien, donc pas de plantage au niveau de la déclaration du onload.

    Mmmmh, la page dans la fenêtre fille est assez simple, juste un petit formulaire avec 2 champs, j'ai du mal à croire que ce soit trop long à charger, mais je vais me pencher sur le DOMContentLoaded.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bon, le DOMContentLoaded apporte effectivement une nouvelle piste.
    Seulement, nouveau petit problème, j'ai remplacé le alert par un document.writeln, et celui-ci écrase la page monsite.com/page.php
    En revanche, si je conserve le alert, il apparait furtivement mais est écrasé par la page monsite.com/page.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
    <title>Page mere</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <script type="text/javascript">
     var novoForm = window.open("https://www.monsite.com/page.php", "wFormx", "width=800,height=600,location=no,menubar=no,status=no,titilebar=no,resizable=no,");
     if (novoForm == null)
    	 alert("novoForm nul");
     else{
    	 document.addEventListener("DOMContentLoaded", function(event){
    		 novoForm.document.writeln("DOMContentLoaded");
    	 })
     }
    </script>
    </body>
    </html>
    Concrètement, le code que je veux insérer dans l'event doit remplir un formulaire de la page monsite.com/page.php, mais j'ai l'impression que novoForm.document ne retrouve pas le formulaire (novoForm.document.forms.length = 0)...

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Tu t'es fait troller par document.write
    Explications : Comprendre document.write

    Edit: Je rajoute parce que l'article ne mentionne pas directement de solution pour remplacer document.write. Il y a insertAdjacentHTML ou bien innerHTML, plus connu mais moins efficace.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    arf... Je pensais mettre du basique, et je tombe sur un cas particulier !
    Merci pour ton aide, je commence à avoir mal au crâne là !

    Bon, je repars sur un novoForm.alert au lieu du document.write.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
    <title>Page mere</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <script type="text/javascript">
     var novoForm = window.open("https://www.monsite.com/page.php", "wFormx", "width=800,height=600,location=no,menubar=no,status=no,titilebar=no,resizable=no,");
     if (novoForm == null)
    	 alert("novoForm nul");
     else{
    	 document.addEventListener("DOMContentLoaded", function(event){
    		 novoForm.alert("DOMContentLoaded");
    	 })
     }
    </script>
    </body>
    </html>
    Et là, je peux voir clairement que la méthode est lancée, parce que, dans l'ordre :
    * une nouvelle fenêtre firefox est ouverte
    * le message alert DOMContentLoaded apparaît
    * mais il est instantanément remplacé par le contenu de la page de monsite.com

    Donc si je comprends bien, la méthode se lance AVANT que le contenu de monsite.com ne soit présent, et je ne pourrais pas avoir accès au formulaire présent sur monsite.com par le biais de ma méthode du listener...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Pour info, la page fille est une page située sur un serveur distant. D'après la doc sur window.open (https://developer.mozilla.org/fr/doc...PI/Window/open), la page reste about:blank, ce qui expliquerait mon problème de synchronisation.
    Seulement, je ne vois pas vraiment de solution...
    Quelqu'un aurait-il une idée ?

  8. #8
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Effectivement cette histoire de synchro pose problème. Après l'appel à window.open, tu dois reporter l'exécution du reste de ton script au moyen d'un setTimeout avec un délai de 0 : cela a pour effet de mettre le bout de script en attente pour « juste après ».

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var novoForm = window.open("https://www.monsite.com/page.php", "wFormx", "...");
     if (novoForm == null) {
    	alert("novoForm nul");
    } else {
    	setTimeout(function () {
    		novoForm.document.addEventListener("DOMContentLoaded", function(event){
    			novoForm.alert("DOMContentLoaded");
    		 });
    	}, 0);
     }
    De plus, si les domaines de la fenêtre mère et de la fille sont différents, tu n'auras pas le droit d'accéder au contenu de la fenêtre fille, et tu recevras une erreur avec un message du genre permission denied. Dans ce cas, si tu peux ajouter des scripts sur le domaine de la fenêtre fille, tu peux utiliser l'API postMessage.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Hmmm, je n'ai pas la main sur le domaine de la page fille... J'ai peur que le problème soit insoluble.
    Je vais tenter le setTimeout pour ma culture personnelle, mais je vais me heurter au problème de droits.
    Merci pour toutes ces infos en tout cas !

Discussions similaires

  1. Exécuter une fonction au chargement d'une JSP
    Par mac&cheese dans le forum Struts 1
    Réponses: 5
    Dernier message: 07/03/2011, 18h15
  2. excuter une fonction au chargement d'une page
    Par xess91 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/12/2009, 20h11
  3. Réponses: 3
    Dernier message: 16/04/2009, 08h34
  4. [Langage] une fonction comme argument d'une fonction?
    Par Krishna dans le forum Langage
    Réponses: 9
    Dernier message: 15/10/2008, 20h31
  5. passage d'une fonction en parametre d'une fonction
    Par psylox dans le forum Langage
    Réponses: 5
    Dernier message: 06/10/2008, 16h40

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