打印

BX2012: 某些情况下除了 IE 和 Opera 之外的浏览器中 window.close 方法无法关闭由直接输入 URL 或 Ctrl + 点击链接方式打开的窗口

作者:钱宝坤

标准参考

无。

问题描述

目前的主流浏览器都支持 window.close 方法,但并不是所有的窗口都可以通过调用 window.close 方法来关闭。

造成的影响

用多种方式打开一个页面,然后用 window.close() 关闭它,在各浏览器下表现有所不同。如在地址栏中直接输入URL 时,Firefox Chrome Safari 下调用 window.close() 关闭页面无效。再如 Ctrl + 点击链接打开的窗口,Firefox 下无法通过调用 window.close() 来关闭。

受影响的浏览器

Firefox Chrome Safari  

问题分析

window 对象属于 BOM 范畴,在现行规范标准中没有提及此部门,整体 BOM 实现由各个浏览器厂商制定:

关于 window 对象的资料请参考 MSDN 中说明:http://msdn.microsoft.com/en-us/library/ms535873(v=VS.85).aspx

关于 window 对象的 close 方法请参考 MSDN 中说明: http://msdn.microsoft.com/en-us/library/ms536367(v=VS.85).aspx

关于 window 对象的 close 方法请参 Gecko DOM 中说明: window.close

也可参考 W3C HTML5 草案中关于 window 对象说明:http://www.w3.org/TR/html5/browsers.html#window

 

close 方法属 BOM 体系中的 window 对象的成员,目前它不属于任何标准;但在 w3c html5 草案5.2节 Window 对象中,定义有 close 方法,并指出它将关闭由脚本打开的窗口。

另外,使用 close 方法,存在着安全方面的限制,MSDN 开发中心在介绍 "close Method" 时指出,如果关闭非脚本打开的窗口,将弹出确认提示框。如在 IE 下将告知“网页正在试图关闭窗口”,让你确认是否真的要关闭。

下面再来引用下 Gecko DOM 参考中关于 window.close 的描述:

该方法只允许由 window.open 打开的窗口调用,如果窗口不是通过脚本方式打开的,JavaScript 控制台将报如下警告信息:不允许脚本关闭非脚本打开的窗口。

分析以下代码 :

<a onclick="window.close();return false;" href="javascript:void(0)">close
                window</a> <br/><br/> <a onclick="window.open('#')"
                href="javascript:void(0)">JS : window.open('#')</a> <br/><br/> <a
                onclick="window.showModalDialog('#')" href="javascript:void(0)"> JS :
                window.showModalDialog('#')</a> <br/><br/> <a href="#"
                target="_blank">link(or Press ctrl)</a> <br/><br/> <div
                id="info"></div> <script> window.onload = function() {
                document.getElementById("info").innerHTML = "window.opener : " + window.opener; }
                </script>

其差异如下表格:

  地址栏输入URL 点击链接 Ctrl键+点击链接 window.open window.showModalDialog
IE6 提示窗口关闭 直接关闭 直接关闭 直接关闭 直接关闭
IE7/8 直接关闭 提示窗口关闭 提示窗口关闭 直接关闭 直接关闭
Firefox 不关闭,无提示 直接关闭 不关闭,无提示 直接关闭 直接关闭
Safari 不关闭,无提示 直接关闭 直接关闭 直接关闭 直接关闭
Chrome 不关闭,无提示 直接关闭 直接关闭 直接关闭 直接关闭
Opera 直接关闭 直接关闭 直接关闭 直接关闭 不支持

解决方案

使用 window.close() 来关闭窗口时,需注意以下两点:
1. 直接在地址栏输入URL打开的窗口,在 Firefox Chrome Safar 下无法关闭
2. Ctrl 键 + 点击链接打开的窗口,在 Firefox 下无法关闭
为保证在各主流浏览器下的兼容性,建议采用以脚本形式、或点击链接形式打开新窗口。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6
Chrome 4.0.302.3 dev
Safari 4.0.4
Opera 10.51
测试页面: window_close.html
本文更新时间: 2010-08-06

关键字

window close 关闭 opener