普通的 javascript 不能随意关闭窗口。这是不久前引入的一项安全功能,用于阻止各种恶意攻击和干扰。
从最新的工作规范window.close()
:
close()
如果满足以下所有条件,则 Window 对象上的方法应关闭浏览上下文A:
- 相应的浏览上下文A是script-closeable。
- 现任脚本的浏览上下文熟悉浏览上下文A。
- 现任脚本的浏览上下文被允许导航浏览上下文A。
如果浏览上下文是由脚本创建的辅助浏览上下文(与用户的操作相反),或者如果它是会话历史记录仅包含一个文档的浏览上下文,则它是脚本可关闭的。
这意味着,除了一个小例外,不得允许 javascript 关闭不是由同一 javascript 打开的窗口。
Chrome 允许该例外——它不适用于用户脚本——但 Firefox 不允许。 Firefox 的实现直截了当地指出:
仅允许为使用该方法的脚本打开的窗口调用此window.open
方法。
如果您尝试window.close
从 Greasemonkey / Tampermonkey / userscript 使用,您将得到:
Firefox:错误消息,“ Scripts may not close windows that were not opened by script.
”
Chrome:只是静默失败。
长期解决方案:
解决此问题的最佳方法是制作 Chrome 扩展程序和/或 Firefox 插件。 这些可以可靠地关闭当前窗口。
然而,由于 Greasemonkey/Tampermonkey 脚本带来的安全风险window.close
要小得多;Greasemonkey 和 Tampermonkey 可以在其 API 中合理地提供此功能(本质上为您打包扩展工作)。
考虑提出功能请求。
骇人听闻的解决方法:
Chrome 目前很容易受到“自我重定向”漏洞的攻击。所以像这样的代码通常可以工作:
open(location, '_self').close();
这是错误的行为,IMO,现在(大约在 2015 年 4 月)大部分都被阻止了。仅当刚打开“选项卡”并且在浏览历史记录中没有页面时,它仍然可以从注射代码中起作用。所以它只在极少数情况下有用。
然而,一个变体仍然适用于 Chrome (v43 & v44) 和 Tampermonkey (v3.11 或更高版本)。使用明确@grant
而简单的window.close()
. 例如:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
感谢zanetu的更新。请注意,如果只打开一个选项卡,这将不起作用。它只会关闭其他选项卡。
Firefox对这种攻击是安全的。因此,唯一的 javascript 方法是削弱安全设置,一次一个浏览器。
您可以打开about:config
并设置
allow_scripts_to_close_windows
为true
.
如果您的脚本是供个人使用的,请继续执行此操作。如果您要求其他任何人打开该设置,他们会明智且有理由拒绝偏见。
目前没有适用于 Chrome 的等效设置。