最近才发现这个问题。
在IE8上弹出的popup画面中,使用IE自身的打印预览,预览后点【×】关闭预览画面回到POPUP画面中点close按钮调用window.close()竟然无法关闭页面。而使用【ESC】按键关闭预览画面后,window.close()是正常的。
究其原因是因为IE内核中少写了一句话。
内核中检测了【ESC】按键按下的事件,并且调用了自身的Close()方法。这个方法是封装在IE内部的,外部无法调用。
但并未监听点【×】时的事件。
点【×】后给人感觉是关闭了画面,但其实预览画面属于一个modDialog。点【×】只是隐藏,没有真正的关闭,它会一直在等待打印完成。所以window.close()会不起作用。
后来在网上看到有不少人用WebBrowser的方法,但这种方法需要客户端浏览器降低安全级别,这种方法很危险,除非迫不得已。
后来研究了一种方法可以避免这种关闭不掉的bug,不需要降低安全级别,但是却不太友好。各位可以根据自己的项目需要,在两者之间选择一种解决方案。
我的解决办法是:
在popup的画面中加上如下JS
<script type="text/javascript">
var printFlag = false;
window.onblur = function(){
if(printFlag){
alert("Printing...");
printFlag = false;
}
}
window.onbeforeprint = function(){
printFlag = true;
}
</script>
这样的话,会在弹出打印预览的Dialog之前弹出一个alert。之后预览画面会盖住alert信息。
如果用户点击【×】来关闭打印预览画面,那么关闭后alert框依然在。
此时用户点击alert的确定后,在点close按钮正常调用window.close()就会关闭画面。
注意:以上只是IE上的对应,如果多浏览器请hack。
总的来说,这个IEbug没有太完美的解决方法,如果大家谁有好的办法,欢迎交流一下。