ventanas emergentes de cierre automático en el IE - cómo conseguir un comportamiento adecuado onBlur?

StackOverflow https://stackoverflow.com/questions/735992

Pregunta

Quiero una ventana transitoria para cerrar a sí mismo cuando el usuario hace clic fuera de ella. Esto funciona para Firefox:

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

pero no parece funcionar en Internet Explorer. Algunos otros sitios hacen referencia a un IE-específica "onfocusout" evento, pero no pude encontrar un ejemplo de trabajo coherente de lo que necesito.

¿Qué dice desbordamiento de pila sobre la mejor manera de obtener las ventanas del navegador IE para cerrarse cuando pierden centrarse?

Estoy usando Dojo así que si hay algún atajo en esa biblioteca, la información sería bienvenido. De lo contrario, las llamadas estándar de IE será la mejor respuesta.

¿Fue útil?

Solución

Me di cuenta de la alternativa en el IE.

Este:

        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");
        };

debe ser escrito como este para trabajar en el 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");
            }
        };

Las razones?

  • En IE, objetos de ventana no responden a borrar eventos. Por lo tanto tenemos que utilizar el evento onfocusout propietario.
  • En IE, onfocusout es enviado por la mayoría de los elementos HTML, por lo que hay que añadir un poco de lógica para determinar qué onfocusout es la causada por la ventana perder el foco. En onfocusout, el atributo activeElement del documento siempre es diferente del valor anterior - excepto cuando la propia ventana pierde el foco. Esta es la señal para cerrar la ventana.
  • En IE, documentos en una nueva ventana envían un onfocusout cuando se crea por primera vez la ventana. Por lo tanto, sólo tenemos que agregar el controlador onfocusout después de que se ha puesto de relieve.
  • En IE, window.open no aparece para devolver un identificador de ventana de forma fiable cuando se crean nuevas ventanas. Por lo tanto hay que mirar hacia arriba la ventana por su nombre con el fin de cerrarla.

Otros consejos

Probar:

document.onfocusout = window.close();

Usted puede tratar esto como parte de un bloque de código IE-específica:

w.onblur = function() { w.close();};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top