Javascript window.close和self.close请勿在Chrome中关闭窗口
问题是,当我调用Javascript window.close和self.close请勿在Chrome中关闭窗口,javascript,google-chrome,greasemonkey,tampermonkey,Javascript,Google Chrome,Greasemonkey,Tampermonkey,问题是,当我调用window.close()或self.close()时,它不会关闭窗口。现在人们似乎相信,在Chrome中,你不能用脚本关闭任何非脚本创建的窗口。这显然是错误的,但无论如何,它应该仍然这样做,即使它需要弹出一个警报来确认。这些都没有发生 那么,有没有人有真正的、功能性的、经过验证的方法来关闭一个窗口,比如使用javascript:window.close()或javascript:self.close()关闭一个窗口,它确实做到了预期的效果,并且在每一个非基于Chrome的浏览
window.close()
或self.close()
时,它不会关闭窗口。现在人们似乎相信,在Chrome中,你不能用脚本关闭任何非脚本创建的窗口。这显然是错误的,但无论如何,它应该仍然这样做,即使它需要弹出一个警报来确认。这些都没有发生
那么,有没有人有真正的、功能性的、经过验证的方法来关闭一个窗口,比如使用javascript:window.close()
或javascript:self.close()
关闭一个窗口,它确实做到了预期的效果,并且在每一个非基于Chrome的浏览器中都能正常运行?任何建议都将不胜感激,我正在寻找Javascript特定的解决方案,而不是JQuery或第三方实现
更新:虽然很多建议都存在严重的局限性和可用性问题,但最新的建议(针对TamperMonkey)使用脚本标题中的/@grant window.close
通常会在通常无法处理close方法的选项卡上起作用。虽然这并不完全理想,也不适用于所有情况,但对我来说,这是一个很好的解决方案。尽管我认为这“显然是错误的”,但你所说的“似乎是一种信念”实际上是正确的。Mozilla的文档说
仅允许对使用window.open方法的脚本打开的窗口调用此方法。如果窗口不是由脚本打开的,则JavaScript控制台中会出现以下错误:脚本可能无法关闭非由脚本打开的窗口
你说它“应该仍然这样做”,但我认为你找不到任何支持这一点的参考资料,也许你记错了什么?普通javascript无法随意关闭windows。这是一种安全功能,不久前引入,用于阻止各种恶意攻击和骚扰 发件人: 如果满足以下所有条件,则窗口对象上的
close()
方法应关闭浏览上下文A:
- 相应的浏览上下文是脚本可关闭的
- 现任脚本的浏览上下文熟悉浏览上下文A
- 允许现任脚本的浏览上下文导航浏览上下文A
窗口打开的窗口调用此方法。open
方法。
如果您尝试使用
窗口。从Greasemonkey/Tampermonkey/userscript关闭,您将得到:
Firefox:错误消息“脚本可能无法关闭未由脚本打开的窗口。
”
Chrome:只是默默地失败了
长期解决办法:
处理这个问题的最好方法是制作一个Chrome扩展和/或Firefox插件。这些可以可靠地关闭当前窗口
但是,由于window.close
所带来的安全风险对于Greasemonkey/Tampermonkey脚本来说要小得多;Greasemonkey和Tampermonkey可以在其API中合理地提供此功能(基本上是为您打包扩展工作)。
考虑提出功能请求。
骇人的解决办法:
Chrome当前易受“自我重定向”攻击。所以像这样的代码通常都是有效的:
open(location, '_self').close();
国际海事组织称,这是一种有缺陷的行为,现在(大约2015年4月)大部分被阻止。如果选项卡是新打开的,并且在浏览历史记录中没有页面,它仍然可以从注入的代码工作。所以它只在非常小的情况下有用
但是,一个变体仍然适用于Chrome(v43和v44)和Tampermonkey(v3.11或更高版本)。使用显式的@grant
和普通的窗口。关闭()。例如:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
谢谢你的更新。请注意,如果只有一个选项卡处于打开状态,则此操作将不起作用。它只关闭其他选项卡
Firefox对该漏洞是安全的。因此,唯一的javascript方法是禁用安全设置,一次一个浏览器
您可以打开about:config
并设置
允许脚本\u关闭\u窗口
至true
如果您的脚本是供个人使用的,请继续并这样做。如果你要求其他人打开这个设置,他们会明智而有理由带着偏见拒绝
目前没有Chrome的等效设置。此功能的要求:
您必须从窗口启动器打开窗口/选项卡,才能获得javascript句柄使其工作,因为它并不总是在未通过窗口启动器脚本打开的选项卡上工作。此测试页面显示了如何:
如果您在我的启动程序中看不到它工作,则需要发布您的浏览器、设备和版本。不同版本的浏览器在不同的设备上的行为不同。(比如ipad上的Firefox和Chrome,它们并不是他们所说的那样。它们是具有不同外观的Safari!)
因此,有一点很重要,比如说“我在使用iOs 14.5的iPad上使用Safari 10.14”,所以
open(location, '_self').close();
function quitBox(cmd)
{
if (cmd=='quit')
{
open(location, '_self').close();
}
return false;
}
<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />
function open_a_window()
{
window.open("window_to_close.htm");
return false;
}
<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />
window.open('', '_self', '');
window.close();
chrome.windows.remove(integer windowId, function callback)
window.location.href = '/closekiosk';
var win = window.open("about:blank", "_self");
win.close();
window.open('location', '_self', '');
window.close();
// @grant window.close
window.close();
window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);
<script language="javascript">
function open_a_window()
{
var w = 200;
var h = 200;
var left = Number((screen.width/2)-(w/2));
var tops = Number((screen.height/2)-(h/2));
window.open("window_to_close.html", '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+tops+', left='+left);
return false;
}
// opener:
window.onmessage = function (e) {
if (e.data === 'location') {
window.location.replace('https://www.google.com');
}
};
</script>
<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />
<!DOCTYPE html>
<html>
<body onload="quitBox('quit');">
<h1>The window closer:</h1>
<input type="button" onclick="return quitBox('quit');" value="Close This Window/Tab" />
<script language="javascript">
function quitBox(cmd)
{
if (cmd=='quit')
{
window.opener.postMessage('location', '*');
window.open(location, '_self').close();
}
return false;
}
</script>
</body>
</html>
@grant window.close
document.getElementsByTagName ('html') [0] .remove ();