Auto-fechar popups no IE - como obter o comportamento onBlur adequada?
-
09-09-2019 - |
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.
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();};