普通的javascript不能随意关闭窗口。这是一项安全功能,不久前引入,用于阻止各种恶意漏洞利用和烦恼。
来自 window.close()
的最新工作规范:
如果满足以下所有条件,则 Windows 对象上的方法应关闭浏览上下文 A:close()
- 相应的浏览上下文 A 是脚本可关闭的。
- 现有脚本的浏览上下文熟悉浏览上下文 A。
- 允许现有脚本的浏览上下文导航浏览上下文 A。
如果浏览上下文是由脚本(而不是由用户的操作)创建的辅助浏览上下文,或者如果它是会话历史记录仅包含一个文档的浏览上下文,则浏览上下文是可脚本关闭的。
这意味着,除了一个小的例外,JavaScript不能被允许关闭一个没有被同一个javascript打开的窗口。
Chrome 允许这种例外 - 它不适用于用户脚本 - 但是 Firefox 不允许。Firefox 实现完全声明:
只允许对使用 window.open
方法的脚本打开的窗口调用此方法。
如果你尝试使用从Greasemonkey / Tampermonkey / userscript,你会得到:
Firefox:错误消息,“”
Chrome:只是默默地失败了。window.close
Scripts may not close windows that were not opened by script.
长期解决方案:
处理这个问题的最好方法是制作Chrome扩展程序和/或Firefox附加组件。这些可以可靠地关闭当前窗口。
但是,由于 所带来的安全风险对于 Greasemonkey/Tampermonkey 脚本要小得多。Greasemonkey 和 Tampermonkey 可以在其 API 中合理地提供此功能(实质上是为您打包扩展工作)。
考虑提出功能请求。window.close
黑客解决方法:
Chrome目前容易受到“自我重定向”攻击。所以像这样的代码曾经在一般情况下工作:
open(location, '_self').close();
这是错误的行为,IMO,现在(大约截至2015年4月)大部分被阻止。仅当选项卡是新打开的并且浏览历史记录中没有页面时,它仍然可以从注入的代码中工作。因此,它仅在非常小的情况下有用。
但是,变体仍然适用于Chrome(v43和v44)以及 Tampermonkey(v3.11或更高版本)。使用显式和纯化的 .EG:@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 的等效设置。