Pergunta

Eu quero uma janela transitória para fechar-se quando o usuário clica longe dele. Isso funciona para Firefox:

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

mas não parecem funcionar no Internet Explorer. Alguns outros sites fez referência a um específico IE "onfocusout" evento, mas eu não poderia encontrar um exemplo de trabalho coerente do que eu preciso.

O que Stack Overflow dizer sobre a melhor maneira de obter as janelas do navegador IE para fechar quando perder o foco?

Eu estou usando Dojo por isso, se há algum atalho nessa biblioteca, informação seria bem-vindo. Caso contrário, as chamadas IE padrão será a melhor resposta.

Foi útil?

Solução

Eu descobri a alternativa no 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");
        };

deve ser escrito assim ao trabalho no 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");
            }
        };

As razões?

  • No IE, objetos window não respondem a borrar eventos. Portanto, devemos usar a proprietária onfocusout evento.
  • No IE, onfocusout é enviado pela maioria dos elementos HTML, por isso devemos adicionar alguma lógica para determinar qual onfocusout é aquele causado pela janela perder o foco. Em onfocusout, o atributo activeElement do documento é sempre diferente do valor anterior - , exceto , quando a própria janela perde o foco. Esta é a sugestão para fechar a janela.
  • No IE, documentos em uma nova janela enviar uma onfocusout quando a janela é criada pela primeira vez. Portanto, só deve adicionar o onfocusout manipulador depois de ter sido trazida para o foco.
  • No IE, window.open não parece voltar com segurança um identificador de janela quando novas janelas são criados. Portanto, devemos olhar a janela pelo nome, a fim de fechá-lo.

Outras dicas

Tente:

document.onfocusout = window.close();

Você pode tentar isso como parte de um bloco de código específico do IE:

w.onblur = function() { w.close();};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top