2009-04-09 5 views
1

Je souhaite qu'une fenêtre temporaire se ferme lorsque l'utilisateur clique dessus. Cela fonctionne pour Firefox:Popups à fermeture automatique dans IE - comment obtenir un comportement onBlur correct?

var w = window.open(...); 
dojo.connect(w, "onblur", w, "close"); 

mais cela ne semble pas fonctionner dans Internet Explorer. Certains autres sites ont fait référence à un événement «onfocusout» spécifique à IE, mais je n'ai pas trouvé d'exemple fonctionnel cohérent de ce dont j'ai besoin.

Que dit Stack Overflow sur la meilleure façon de fermer les fenêtres du navigateur IE lorsqu'elles perdent leur focus? J'utilise Dojo donc s'il y a un raccourci dans cette bibliothèque, les informations seraient les bienvenues. Sinon, les appels IE standard seront la meilleure réponse.

+0

pouvez-vous configurer l'événement sur la fenêtre contextuelle lorsque la fenêtre contextuelle obtient le focus initial? – scunliffe

+0

J'ai essayé ça et je n'ai pas réussi à le faire fonctionner. Je peux essayer à nouveau, cependant. :) –

+0

Le vrai problème est que l'événement ne fonctionne pas dans IE, cependant. –

Répondre

2

Je compris l'alternative dans IE.

Ce:

 that.previewWindowAction = function() { 
      var pw = 
       window.open(this.link, "preview", 
          "height=600,width=1024,resizable=yes," 
          + "scrollbars=yes,dependent=yes"); 
      dojo.connect(pw, "onblur", pw, "close"); 
     }; 

doit être écrit comme cela fonctionne dans IE:

 that.previewWindowAction = function() { 
      var pw = 
       window.open(this.link, "preview", 
          "height=600,width=1024,resizable=yes," 
          + "scrollbars=yes,dependent=yes"); 
      if (dojo.isIE) { 
       dojo.connect 
        (pw.document, 
        "onfocusin", 
        null, 
        function() { 
         var active = pw.document.activeElement; 
         dojo.connect 
          (pw.document, 
           "onfocusout", 
           null, 
           function() { 
            if (active != pw.document.activeElement) { 
             active = pw.document.activeElement; 
            } else { 
             window.open("", "preview").close(); 
            } 
           }); 
        }); 

      } 
      else { 
       dojo.connect(pw, "onblur", pw, "close"); 
      } 
     }; 

Les raisons?

  • Dans IE, les objets de fenêtre ne répondent pas aux événements de flou. Par conséquent, nous devons utiliser l'événement onfocusout propriétaire.
  • Dans IE, onfocusout est envoyé par la plupart des éléments HTML, nous devons donc ajouter une logique pour déterminer quel onfocusout est celui causé par le focus de la fenêtre perdre. Dans onfocusout, l'attribut activeElement du document est toujours différent de la valeur précédente - sauf lorsque la fenêtre elle-même perd le focus. C'est le signal pour fermer la fenêtre.
  • Dans IE, les documents d'une nouvelle fenêtre envoient un onfocusout lors de la création de la fenêtre. Par conséquent, nous devons seulement ajouter le gestionnaire onfocusout après qu'il a été mis au point.
  • Dans IE, window.open ne semble pas renvoyer de manière fiable un handle de fenêtre lors de la création de nouvelles fenêtres. Par conséquent, nous devons rechercher la fenêtre par son nom afin de la fermer.
0

Vous pouvez essayer cela dans le cadre d'un bloc de code spécifique IE-:

w.onblur = function() { w.close();}; 
+0

C'est essentiellement ce que j'ai. Cela fonctionne pour Firefox mais pas IE. IE ne déclenche pas l'événement aux moments appropriés. –

1

Essayez:

document.onfocusout = window.close(); 
+0

C'est le mauvais document AFAICT (le document de la fenêtre parente). Je pense que j'ai essayé w.document aussi et ça n'a pas marché. Je n'ai pas IE à la maison alors je vais vérifier à nouveau demain. –

+0

Désolé. Je supposais que vous aviez accès à la page en cours de chargement dans la fenêtre contextuelle. Ce code irait là-bas. – w4g3n3r

Questions connexes