window.close和self.close不要在Chrome中closures窗口
问题是,当我调用window.close()
或self.close()
它不closures窗口。 现在似乎有一种信念,在Chrome中,您不能通过脚本closures任何不是脚本创build的窗口。 这是明显的错误,但不pipe它应该仍然这样做,即使它需要popup一个警报来确认。 这些都没有发生。
所以,有没有人有真正的,function和经过validation的方法来closures一个窗口使用类似于javascript:window.close()
或javascript:self.close()
,实际上做预期的事情,并发生在每个浏览器基于Chrome? 任何build议将不胜感激,我正在寻找Javascript特定的解决scheme,没有什么JQuery或第三方的实施。
更新:虽然大部分build议有严重的限制和可用性问题,但是使用脚本头中的// @grant window.close
的最新build议(特定于TamperMonkey)通常会在通常不能使用处理closures的方法。 虽然不是完全理想的,并不是每一个案件,这对我来说是一个很好的解决scheme。
普通的JavaScript无法closures窗户。 这是前段时间介绍的一项安全function,用于阻止各种恶意攻击和烦恼。
从window.close()
的最新工作规范 :
如果满足以下所有条件,则Window对象的
close()
方法应该closures浏览上下文A :
- 相应的浏览上下文A是脚本可closures的 。
- 现任脚本的浏览上下文熟悉浏览上下文A.
- 现任脚本的浏览上下文被允许浏览浏览上下文A.
如果浏览上下文是由脚本创build的辅助浏览上下文(与用户的操作相对),或者如果浏览上下文的会话历史logging仅包含一个文档,则该浏览上下文是脚本可closures的 。
这意味着,有一个小的例外, JavaScript不能被允许closures一个窗口,而不是由相同的JavaScript打开。
Chrome允许这个exception – 它不适用于userscripts – 但Firefox不。 Firefox的执行情况显示 :
该方法只允许使用
window.open
方法调用由脚本打开的窗口。
如果你尝试使用Greasemonkey / Tampermonkey / userscript中的window.close
,你会得到:
Firefox:错误消息“ Scripts may not close windows that were not opened by script.
”。
Chrome:只是默默地失败。
长远的解决scheme:
处理这个问题的最佳方法是制作一个Chrome扩展程序和/或Firefox附加组件。 这些可以可靠地closures当前窗口。
但是,由于window.close
所带来的安全风险远远小于Greasemonkey / Tampermonkey脚本; Greasemonkey和Tampermonkey可以在他们的API中合理地提供这个function(主要是为你打包扩展工作)。
考虑提出function请求。
哈克变通办法:
Chrome 目前很容易受到“自我redirect”攻击。 所以像这样的代码通常用于工作:
open(location, '_self').close();
这是越野车的行为,国际海事组织,现在(截至2015年4月)大多阻塞。 只有当标签刚刚打开并且浏览历史中没有页面时,它仍然可以从注入的代码工作。 所以这只在很less的情况下才有用。
但是, 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的更新。 请注意,如果只有一个选项卡打开,这将不起作用。 它只closures其他选项卡。
Firefox对这个漏洞很安全。 所以,唯一的javascript方法是一次性削弱安全设置,一个浏览器。
你可以打开about:config
和set
allow_scripts_to_close_windows
为true
。
如果您的脚本是供个人使用的,请继续操作。 如果你让其他人把这个背景打开,他们会很聪明,而且有理由拒绝。
目前没有相应的Chrome设置。
Chrome修复了版本36.0.1985.125中的安全问题
Chrome 36.0.1985.125 2014年7月16日,星期三发行说明
从我的观察,这个更新解决了使用window.close()
closurespopup窗口的问题。 当它失败时,你会在控制台看到这个,“脚本可能只closures由它打开的窗口”。 这意味着哈克变通办法 (布罗克·亚当斯的答案) 可能无法在最新的版本。
所以,在以前的Chrome发布版本中,下面的代码块可能工作,但不是这个更新。
window.open('', '_self', ''); window.close();
对于此更新,您必须相应地更新您的代码以closurespopup窗口。 其中一个解决scheme是获取popup窗口ID并使用
chrome.windows.remove(integer windowId, function callback)
方法删除它。 Chrome扩展程序窗口API可以在chrome.windowsfind。
其实我的Chrome扩展MarkView面临这个问题,我不得不更新我的代码,使其为Chrome浏览器更新工作。 顺便说一句,MarkView是读取和写入Awesome Markdown Files的工具,它提供了包括内容大纲,可sorting表格和代码块语法高亮显示的行号的function。
我也创build了这个post ,欢迎任何评论。
我正在使用Brock Adams发布的方法,如果它是用户启动的,它甚至可以在Firefox中使用。
open(location, '_self').close();
我是从一个button,所以它是用户启动 ,它仍然工作正常使用Chrome 35-40,Internet Explorer 11,Safari 7-8和ALSO Firefox 29-35。 我testing使用Windows和Mac OS X 10.6,10.9和10.10版本8.1,如果这是不同的。
完整的代码:
HTML:
<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />
JavaScript的:
function quitBox(cmd) { if (cmd=='quit') { open(location, '_self').close(); } return false; }
试试这个testing页面:(现在在Chrome 40和Firefox 35中testing)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
在篡改密钥现在你可以使用
// @grant window.close
然后只是打电话
window.close();
许多人仍在试图find一种方法来使用JavaScriptclosuresChrome浏览器。 下面的方法只适用于当您使用Chrome作为APP启动器 – 例如信息亭!
我testing了以下内容:
我正在使用以下扩展程序: closures自助服务terminal
我按照使用说明,它似乎工作得很好(确保你清除caching,而进行testing)。 我使用的JavaScript(附加到单击事件):
window.location.href = '/closekiosk';
我希望能帮助别人,因为这是我find的唯一工作解决scheme。
注意:看起来扩展名在后台运行,并添加了Chrome托盘图标。 它有以下选项选中:“让Chrome在后台运行”(或类似的文字)。 你可能需要玩它,直到它为你工作。 我没有选中它,现在它工作得很好!
尽pipe认为这是“虚假的”,但你所说的“似乎是一种信念”其实是正确的。 Mozilla的window.close文档说
该方法只允许使用window.open方法调用由脚本打开的窗口。 如果窗口未被脚本打开,则JavaScript控制台中将显示以下错误:脚本可能不会closures未由脚本打开的窗口
你说这是“应该还是这样做”,但我不认为你会find任何支持的参考,也许你误解了一些东西?
下面的代码为我工作 –
window.open('location', '_self', ''); window.close();
在Chrome 43.0.2357.81上testing
这可能是旧的,但我们来回答。
我使用top.close()来closures一个选项卡。 window.close()或其他打开…closures没有为我工作。
我发现了一个新的方式,适合我perfetly
var win = window.open("about:blank", "_self"); win.close();
只有使用window.open()打开一个新窗口,新窗口才能够使用上面提到的代码closures。 这完全适合我:)注意:切勿使用href在新选项卡中打开页面。 Window.close()不适用于“href”。 使用window.open()来代替。
试试这样的onclick =“return self.close()”