Gµå*_*ïåñ 165 javascript greasemonkey google-chrome tampermonkey
问题是,当我调用window.close()或self.close()它没有关闭窗口时.现在似乎有一种信念,即在Chrome中你无法通过脚本关闭任何非脚本创建的窗口.这显然是错误的,但无论它应该仍然这样做,即使它需要弹出警报确认.这些都没有发生.
那么,是否有人使用真实的,功能性的,经过验证的关闭窗口的方法,使用类似的东西javascript:window.close()或者javascript:self.close()实际上做了预期的东西以及在非Chrome浏览器的每个浏览器中都能正常运行的东西?任何建议将不胜感激,我正在寻找Javascript特定的解决方案,没有JQuery或第三方实现.
更新:虽然所提出的大部分内容存在严重的局限性和可用性问题,但// @grant window.close在脚本标题中使用的最新建议(特定于TamperMonkey)通常会在通常无法处理close方法的选项卡上执行此操作.虽然不完全理想,并没有针对每种情况推广,但在我的情况下,这是一个很好的解决方案.
Bro*_*ams 178
普通的javascript无法关闭Windows willy-nilly.这是一个安全功能,不久前介绍,以阻止各种恶意攻击和烦恼.
close()如果满足以下所有条件,则Window对象上的方法应该关闭浏览上下文A:
- 相应的浏览上下文A是可关闭脚本的.
- 现任脚本的浏览器上下文是熟悉的浏览器上下文一个.
- 现任脚本的浏览器上下文允许导航浏览器上下文一个.
如果浏览上下文是由脚本创建的辅助浏览上下文(而不是用户的操作),或者如果它是会话历史记录仅包含一个文档的浏览上下文,则浏览上下文可以关闭脚本.
这意味着,除了一个小例外,不得允许javascript关闭未被同一个javascript打开的窗口.
Chrome允许该异常 - 它不适用于用户脚本 - 但Firefox不支持. Firefox实施平台说明:
仅允许为使用该
window.open方法的脚本打开的窗口调用此方法.
如果您尝试使用window.closeGreasemonkey/Tampermonkey/userscript,您将获得:
Firefox:错误消息," Scripts may not close windows that were not opened by script."
Chrome:只是默默地失败.
解决此问题的最佳方法是改为使用Chrome扩展程序和/或Firefox插件. 这些可以可靠地关闭当前窗口.
但是,由于window.closeGreasemonkey/Tampermonkey脚本所带来的安全风险要小得多; Greasemonkey和Tampermonkey可以合理地在他们的API中提供这种功能(基本上为您打包扩展工作).
考虑发出功能请求.
Chrome 目前很容易受到"自我重定向"攻击.所以像这样的代码一般用于工作:
open(location, '_self').close();
Run Code Online (Sandbox Code Playgroud)
这是有缺陷的行为,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);
Run Code Online (Sandbox Code Playgroud)
感谢zanetu的更新.请注意,如果只打开一个选项卡,则无效.它只关闭其他标签.
Firefox可以抵御这种攻击.因此,唯一的javascript方法是一次性删除一个浏览器的安全设置.
你可以打开about:config并设置
allow_scripts_to_close_windows为true.
如果您的脚本仅供个人使用,请继续执行此操作.如果你要求其他人改变这种设置,那么他们就会变得聪明,并且有理由拒绝偏见.
目前没有Chrome的等效设置.
swc*_*ool 31
Chrome 36.0.1985.125星期三,2014年7月16日 发行说明
根据我的观察,此更新修复了使用window.close()关闭弹出窗口的问题.当它失败时,你会在控制台中看到这个,"脚本可能只关闭它打开的窗口." 这意味着hacky解决方法(Brock Adams的答案)可能在最新版本中不起作用.
因此,在之前的Chrome发布的版本中,下面的代码块可能有效但不适用于此更新.
window.open('', '_self', '');
window.close();
Run Code Online (Sandbox Code Playgroud)
对于此更新,您必须相应地更新代码以关闭弹出窗口.其中一个解决方案是获取弹出窗口ID并使用
chrome.windows.remove(integer windowId, function callback)
Run Code Online (Sandbox Code Playgroud)
删除它的方法.可以在chrome.windows中找到Chrome扩展程序窗口API .
实际上我的Chrome扩展程序MarkView正面临这个问题,我不得不更新我的代码,使其适用于此Chrome更新.顺便说一下,MarkView是读取和编写Awesome Markdown文件的工具,它提供的功能包括内容大纲,可排序表和带行号的代码块语法高亮.
我也创建了这篇文章,欢迎任何评论.
bal*_*ing 18
现在你可以使用tampermonkey
// @grant window.close
Run Code Online (Sandbox Code Playgroud)
然后只需打电话
window.close();
Run Code Online (Sandbox Code Playgroud)
Jef*_*ton 15
我正在使用Brock Adams发布的方法,它甚至适用于Firefox,如果它是用户启动的话.
open(location, '_self').close();
Run Code Online (Sandbox Code Playgroud)
我是通过按下按钮调用它,因此它是用户启动的,并且使用Chrome 35-40,Internet Explorer 11,Safari 7-8和ALSO Firefox 29-35仍然可以正常工作.我使用Windows 8.1和Mac OS X 10.6,10.9和10.10的版本进行了测试,如果不同的话.
完整的代码:
HTML:
function quitBox(cmd)
{
if (cmd=='quit')
{
open(location, '_self').close();
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />
Run Code Online (Sandbox Code Playgroud)
试试这个测试页面:(现在在Chrome 40和Firefox 35中测试过)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Min*_*ter 10
许多人仍在尝试使用javascript找到关闭Chrome浏览器的方法.以下方法仅适用于您使用Chrome作为APP启动器 - 例如自助服务终端!
我测试了以下内容:
我正在使用以下扩展名:关闭自助服务终端
我正在遵循使用说明,它似乎工作得很好(确保在进行测试时清除缓存).我使用的javascript是(附加到click事件):
window.location.href = '/closekiosk';
Run Code Online (Sandbox Code Playgroud)
我希望能帮到某个人,因为这是我找到的唯一可行的解决方案.
注意:扩展程序似乎在后台运行,并添加了Chrome托盘图标.它选中了以下选项:"让Chrome在后台运行"(或类似文字).你可能需要玩它,直到它适合你.我取消选中它,现在它工作得很好!
尽管认为它"显然是假的",但你所说的"似乎是一种信念"实际上是正确的.window.close的Mozilla文档说
仅允许对使用window.open方法由脚本打开的窗口调用此方法.如果脚本未打开窗口,则JavaScript控制台中将显示以下错误:脚本可能无法关闭脚本未打开的窗口
你说它"应该仍然这样做",但我认为你不会找到任何支持它的参考,也许你错误地记得了什么?
以下代码对我有用-
window.open('location', '_self', '');
window.close();
Run Code Online (Sandbox Code Playgroud)
在Chrome 43.0.2357.81上测试
我找到了一种适合我的新方法
var win = window.open("about:blank", "_self");
win.close();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
499181 次 |
| 最近记录: |