我在 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 在创建新窗口时似乎无法可靠地返回窗口句柄。因此,我们必须按名称查找窗口才能关闭它。