普通的javascript无法随意关闭Windows。这是一项安全功能,该功能已在不久前推出,用于阻止各种恶意攻击和烦扰。
根据最新的工作规范window.close()
:
close()
如果满足以下所有条件,则Window对象上的方法应关闭浏览上下文A:
- 相应的浏览上下文A是可关闭脚本的。
- 现任脚本的浏览器上下文是熟悉的浏览器上下文一个。
- 现任脚本的浏览器上下文允许导航浏览器上下文一个。
如果浏览上下文是由脚本创建的辅助浏览上下文(而不是用户的操作),或者是会话历史记录仅包含一个Document的浏览上下文,则可以关闭脚本。
这意味着,除了一个小小的例外,不得允许javascript关闭一个未由同一javascript打开的窗口。
Chrome允许该例外-不适用于用户脚本-但Firefox不允许。 Firefox的实施方式明确指出:
仅允许脚本使用该window.open
方法打开的窗口调用此方法。
如果您尝试window.close
从Greasemonkey / Tampermonkey /用户脚本中使用,则会得到:
Firefox:错误消息“ Scripts may not close windows that were not opened by script.
”,
Chrome:静默失败。
长期解决方案:
解决此问题的最佳方法是改用Chrome扩展程序和/或Firefox插件。 这些可以可靠地关闭当前窗口。
但是,window.close
对于Greasemonkey / Tampermonkey脚本,由造成的安全风险要小得多;Greasemonkey和Tampermonkey可以在其API中合理地提供此功能(实际上是为您打包扩展工作)。
考虑提出功能请求。
hacky解决方法:
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目前没有等效设置。
window.close()
在Chrome中为我工作。