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 : 56
    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 : 56
    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 659
    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 659
    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 : 56
    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 : 56
    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 : 55
    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 : 56
    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 : 55
    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 : 56
    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