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 :

IE9 surcharger window.close()


Sujet :

JavaScript

  1. #1
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut IE9 surcharger window.close()
    Bonjour,

    Dans le cadre d'un développement j'ai migré des fenêtres popup classiques (window.open) vers des popups internes en IFRAME

    pour simplifier les choses j'ai surchargé le code window.close() par ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (window.frameElement) {
      window.close = function() { close_iframe_popup() }
    }
    comme cela le code JS des anciennes popup fonctionne toujours en IFRAME

    sauf que sous IE9 en DOCTYPE html4/loose, la fonction n'est plus surchargée, en mode debug je vois bien que window.close pointe toujours sur du code natif et l'appel à la fonction ne donne rien.

    Quelqu'un aurait-il une astuce pour contourner cela sans changer le doctype ? un évènement, ou une syntaxe spécifique ?!

    Merci
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  2. #2
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    As-tu essayé d'associer ton gestionnaire autrement que par la méthode DOM-0 (element.on{type} = function() {//code}) ?

    Je pense notamment à addEventListener/attachEvent.

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    As-tu essayé d'associer ton gestionnaire autrement que par la méthode DOM-0 (element.on{type} = function() {//code}) ?

    Je pense notamment à addEventListener/attachEvent.
    oui, le problème est que window.close() dans une iframe ne déclenche rien
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Ah ok, au temps pour moi, je comprends mieux. ^^

    Du coup, par contre, quel est l'équivalent dans l'interface de ta nouvelle version (avec iframe) de la fermeture de popup ? il y a un bouton fermer dans l'iframe ? ou alors, si l'utilisateur n'est pas censé "fermer" la partie iframe, est-ce la fermeture de la page mère qui constitue l'événement probant ? si oui, il faut peut-être passer par onbeforeunload... à voir ^^

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    onbeforeunload ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    Ah ok, au temps pour moi, je comprends mieux. ^^

    Du coup, par contre, quel est l'équivalent dans l'interface de ta nouvelle version (avec iframe) de la fermeture de popup ? il y a un bouton fermer dans l'iframe ? ou alors, si l'utilisateur n'est pas censé "fermer" la partie iframe, est-ce la fermeture de la page mère qui constitue l'événement probant ? si oui, il faut peut-être passer par onbeforeunload... à voir ^^
    alors initialement j'avais une popup ouverte par window.open(...) et en effet un bouton "Fermer" qui fait appelle window.close();

    tout cela étant un framework maison, j'ai pu remplacer le window.open() par une fonction iframe_popup() qui ouvre l'URL dans une iframe qui gère un mode modale avec quelques DIV supplémentaires.

    avec IE6..IE8, FF, Opera, Chrome, il m'a suffit de surcharger window.close() pour que le bouton Fermer (ou tout autre appel à la fonction window.close() dans un AJAX, ou que sais-je) fonctionne comme avant.

    sous IE9, window.close() appelle le code natif et ne prend pas en compte mon code à moi

    démonstration du problème :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="fr"><html>
    <head>
    <title>IE9</title>
    <body>
    <iframe src="test.html"></iframe>
    </body>
    </html>

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="fr">
    <head>
    <title>IE9</title>
    <script type="text/javascript">
    window.close = function() { alert('pas de close'); }
    </script>
    </head>
    <body>
    <a href="javascript:window.close()">close</a>
    </body>
    </html>

    Il suffit de supprimer le DOCTYPE du fichier principal pour que cela fonctionne...mais bonjour les dégâts sur le rendu HTML
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Si tu veux déclencher des traitements à la fermeture, il me semble plus sain de passer par un gestionnaire lié à l'événement de fermeture plutot que de surcharger la méthode de fermeture elle-même, si je me fais bien comprendre ^^

    Plus précisément, l'idée était d'essayer onbeforeunload :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="fr">
    <head>
    <title>IE9</title>
    <script type="text/javascript">
    window.onbeforeunload = function() { alert('juste avant la fermeture'); }
    </script>
    </head>
    <body>
    <a href="javascript:window.close()">close</a>
    </body>
    </html>
    ...ce qui ne modifie en rien ta façon de "fermer la fenêtre", et cela permet même (c'est habituellement la raison première de l'utilisation de cette technique, d'ailleurs) de gérer de la même manière les autres événements entrainant la fermeture (changement d'adresse dans la barre d'URL, clic sur l'icone "croix rouge" en haut à droite, fermeture du navigateur, etc.)

    Par contre, si l'action est posée sur un bouton, et que l'événement de "fermeture" n'est plus souhaitable dans un contexte avec iframe, au bénéfice d'un traitement DOM sur la page mère qui vient "effacer" l'iframe, tu n'as bien sûr plus besoin de passer par la simulation d'une fermeture de popup...

  8. #8
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    Si tu veux déclencher des traitements à la fermeture, il me semble plus sain de passer par un gestionnaire lié à l'événement de fermeture plutot que de surcharger la méthode de fermeture elle-même, si je me fais bien comprendre ^^

    Plus précisément, l'idée était d'essayer onbeforeunload :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="fr">
    <head>
    <title>IE9</title>
    <script type="text/javascript">
    window.onbeforeunload = function() { alert('juste avant la fermeture'); }
    </script>
    </head>
    <body>
    <a href="javascript:window.close()">close</a>
    </body>
    </html>
    ...ce qui ne modifie en rien ta façon de "fermer la fenêtre", et cela permet même (c'est habituellement la raison première de l'utilisation de cette technique, d'ailleurs) de gérer de la même manière les autres événements entrainant la fermeture (changement d'adresse dans la barre d'URL, clic sur l'icone "croix rouge" en haut à droite, fermeture du navigateur, etc.)

    Par contre, si l'action est posée sur un bouton, et que l'événement de "fermeture" n'est plus souhaitable dans un contexte avec iframe, au bénéfice d'un traitement DOM sur la page mère qui vient "effacer" l'iframe, tu n'as bien sûr plus besoin de passer par la simulation d'une fermeture de popup...
    c'est tout le contraire

    le bouton doit fermer l'IFRAME, mais une IFRAME ne se ferme pas avec window.close

    mon exemple était trompeur, voici à quoi pourrait ressembler le code

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <script type="text/javascript">
    if (window.frameElement) {
      window.close = function() { 
       window.frameElement.parentNode.removeChild(window.frameElement);
      }
    }
    </script>

    la seule solution que je vois actuellement et de retrouver tous les window.close() partout dans le code et les remplacer par un close_popup() qui serait sous cette forme:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <script type="text/javascript">
    function close_popup() {
      if (window.frameElement)
        window.frameElement.parentNode.removeChild(window.frameElement);
      else
        window.close();
    }
    </script>

    car le code HTML de la popup peut très bien être utilisé en dehors d'une iframe, la surcharge (conditionnée) de window.close() était la solution la plus immédiate et élégante...jusque IE9
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <script type="text/javascript">
    if (window.frameElement) {
      window.close = function() { 
       window.frameElement.parentNode.removeChild(window.frameElement);
      }
    }
    </script>
    Tu te compliques la vie pour rien comme ça et ça ne risque pas de fonctionner : frameElement référence l'objet window de ton iframe, qui n'a donc pas de parentNode.
    Pourquoi ne pas passer tout simplement par la balise iframe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <script type="text/javascript">
    if (document.getElementsByTagName('iframe').length) {
      window.close = function() { 
       document.getElementsByTagName('iframe')[0].parentNode.removeChild(document.getElementsByTagName('iframe')[0]);
      }
    }
    </script>
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  10. #10
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <script type="text/javascript">
    if (window.frameElement) {
      window.close = function() { 
       window.frameElement.parentNode.removeChild(window.frameElement);
      }
    }
    </script>
    Tu te compliques la vie pour rien comme ça et ça ne risque pas de fonctionner : frameElement référence l'objet window de ton iframe, qui n'a donc pas de parentNode.
    Pourquoi ne pas passer tout simplement par la balise iframe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <script type="text/javascript">
    if (document.getElementsByTagName('iframe').length) {
      window.close = function() { 
       document.getElementsByTagName('iframe')[0].parentNode.removeChild(document.getElementsByTagName('iframe')[0]);
      }
    }
    </script>
    merci pour ta contribution mais l'iframe a bel et bien un parent (frameElement c'est l'iframe pas l'objet window qui le contient), mon code fonctionne SAUF que sous IE9 on ne peut plus surcharger window.close()
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ah oui tiens... au temps pour moi

    Sinon, effectivement, pour surcharger window.close() avec IE9, il ne faut étonnamment pas passer par l'objet window mais par une fonction classique, peut-être parce que le prototype de cet objet n'est pas disponible...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function close(){
        alert('toto');
    }
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  12. #12
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut Solution trouvé !
    Arf, sans faire exprès j'ai trouvé la solution !

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <script type="text/javascript">
    if (window.frameElement) {
      window.close = function() { 
       window.frameElement.parentNode.removeChild(window.frameElement);
      }
      function close() { window.close() } // HACK !
    }
    </script>

    c'est hallucinant, mais en définissant une fonction close() qui appelle window.close(), IE9 retrouve la surchage !

    démonstration qui montre que c'est bien la surcharge qui est invoquée :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <script type="text/javascript">
      window.close = function() { 
       alert('window.close()';
      }
      function close() { 
       alert('close()');
      }
    }
    </script>
    <button onclick="window.close()">window.close()</button>
    <button onclick="close()">close()</button>
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. surchargement de window.close()
    Par yjuliet dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 12/06/2007, 13h28
  2. Problème avec window.close()
    Par Didje dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 13/12/2005, 17h32
  3. window.close();
    Par 12_darte_12 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/10/2005, 14h37
  4. après un window.close() la page se réouvre toute seule???
    Par linux dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/08/2005, 17h29
  5. On Windows Closing ???
    Par BainE dans le forum MFC
    Réponses: 4
    Dernier message: 29/08/2005, 12h38

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