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は、新しいウィンドウが作成されたときにウィンドウハンドルを確実に返すようには見えません。したがって、ウィンドウを閉じるには、名前でウィンドウを検索する必要があります。