Я разобрался с альтернативой в 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 атрибут activeElement документа всегда отличается от предыдущего значения - , за исключением , когда само окно теряет фокус. Это сигнал для закрытия окна.
- В IE документы в новом окне отправляют onfocusout при первом создании окна. Поэтому мы должны добавлять обработчик onfocusout только после того, как он был в фокусе.
- В IE window.open не может надежно возвращать дескриптор окна при создании новых окон. Поэтому мы должны посмотреть в окне по имени, чтобы закрыть его.