Самозакрывающиеся всплывающие окна в IE — как добиться правильного поведения onBlur?
-
09-09-2019 - |
Вопрос
Я хочу, чтобы временное окно закрывалось, когда пользователь от него отходит.Это работает для Firefox:
var w = window.open(...);
dojo.connect(w, "onblur", w, "close");
но, похоже, он не работает в Internet Explorer.Некоторые другие сайты ссылались на событие onfocusout, специфичное для IE, но я не смог найти внятного рабочего примера того, что мне нужно.
Что говорит Stack Overflow о лучшем способе закрытия окон браузера IE, когда они теряют фокус?
Я использую Dojo, поэтому, если в этой библиотеке есть какой-нибудь ярлык, буду приветствоваться.В противном случае лучшим ответом будут стандартные вызовы IE.
Решение
Я нашел альтернативу в IE.
Этот:
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");
};
для работы в 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");
}
};
Причины?
- В IE объекты окна не реагируют на события размытия.Поэтому мы должны использовать собственное событие onfocusout.
- В IE onfocusout отправляется большинством HTML-элементов, поэтому мы должны добавить некоторую логику, чтобы определить, какой именно onfocusout вызван потерей фокуса окна.В onfocusout атрибут activeElement документа всегда отличается от предыдущего значения — кроме когда само окно теряет фокус.Это сигнал закрыть окно.
- В IE документы в новом окне отправляют onfocusout при первом создании окна.Поэтому мы должны добавлять обработчик onfocusout только после того, как он оказался в фокусе.
- В IE window.open, похоже, не возвращает дескриптор окна надежно при создании новых окон.Поэтому мы должны найти окно по имени, чтобы закрыть его.
Другие советы
Пытаться:
document.onfocusout = window.close();
Вы можете попробовать это как часть блока кода, специфичного для IE:
w.onblur = function() { w.close();};
Не связан с StackOverflow