window.close()没有't工作-脚本可能只关闭它打开的窗口
window.close() doesn't work - Scripts may close only the windows that were opened by it
当我试图通过Javascript的window.close()
方法关闭窗口时,当浏览器在控制台上显示以下消息时,我总是遇到问题:
"Scripts may close only the windows that were opened by it."
这种情况出现在页面的每一部分。我可以直接运行链接、按钮或脚本,但始终显示此消息。
我试图用window.close();
方法替换下面的函数(或这些函数的变体),但什么也没发生:
window.open('', '_self', '');
window.close();
我通过谷歌和Stack Overflow搜索了许多网页,但没有任何建议可以解决我的问题。
经过多次尝试,我改变了测试该控制器的方式。然后我发现问题总是发生在我通过Chrome中的Ctrl + Shift + T
快捷方式重新打开页面时。所以页面运行了,但没有父窗口引用,因为这是无法关闭的。
错误消息不会比这更清楚:
"Scripts may close only the windows that were opened by it."
如果你的脚本没有启动打开窗口(使用类似window.open的东西),那么该窗口中的脚本不允许关闭它。这是一种安全措施,可以防止网站控制你的浏览器并关闭窗口。
您不能关闭当前窗口或使用"_self"打开的任何窗口或页面但是你可以做这个
var customWindow = window.open('', '_blank', '');
customWindow.close();
遇到此问题,但我使用的是window.open('','_blank','')
。问题似乎是使用window.open
的脚本也应该调用close
函数。
我找到了一个肮脏但简单的解决方法,似乎可以完成任务-
// write a simple wrapper around window.open that allows legal close
const openWindow = () => {
const wind = window.open('','_blank','');
// save the old close function
const actualClose = wind.close;
// Override wind.close and setup a promise that is resolved on wind.close
const closePromise = new Promise(r=>{wind.close = ()=>{r(undefined);}});
// Setup an async function
// that closes the window after resolution of the above promise
(async ()=>{
await closePromise; // wait for promise resolution
actualClose(); // closing the window here is legal
})();
return wind;
}
// call wind.close anywhere
document.getElementById('myButton').addEventListener('click', wind.close)
我不知道这是否以某种方式破坏了一些安全功能,或者稍后是否会进行修补,但它似乎在chrome版本101.0.4951 上有效
您只能关闭脚本创建的窗口,因此这是可能的:
window.open("", "_blank", "");
window.close();
但除此之外,你可以更改链接,比如:
location.href = "https://bruh.io";
确保您有https://
否则,如果您在https://www.youtube.com
中并运行location.href = bruh.io
,您将转到https://www.youtube.com/bruh.io
如果窗口是通过以下链接向用户打开的,则可以关闭该窗口:
<А rel='opener' href='test.net '></А>
注意标签:rel="开启器"
不要在父级中使用<a href='URL' target='_blank'>open</a>
来打开新窗口。
在父级中使用<a href='' onClick="window.open('URL'); return false">open</a>
。
然后你可以在孩子们身上使用<a href='' onClick="window.open('URL'); return false">close</a>
。
对我来说很有魅力。
我的内部使用解决方案是创建桌面快捷方式
此处示例:
- 谷歌浏览器(目标)
"C:'Program Files (x86)'Google'Chrome'Application'chrome.exe" https://url_of_my_app
- Microsoft Edge(目标)
"C:'Program Files (x86)'Microsoft'Edge'Application'msedge.exe" https://url_of_my_app
在浏览器设置中,您必须允许从应用程序的url弹出和重定向
因此window.close();
起作用
它使用打开弹出和关闭窗口
window.open('/my_page.htm', '_blank', 'popup=true');
window.close();
我不知道以后是否会修补,但它似乎确实有效:
Windows 10
Google Chrome 113.0.5672.127(官方版)64位
Microsoft Edge 113.0.1774.50(官方版本)(64位)
有人能在其他操作系统上测试一下吗?
参考:
https://developer.mozilla.org/en-US/docs/Web/API/Window/open
windows对象有一个windows字段,它在其中被克隆并存储打开窗口的日期,应该在此字段上调用关闭:
window.open("", '_self').window.close();
工作解决方案2022
const closeWindow = () => {
window.open(location.href, "_self", "");
window.close()
}
它是如何工作的
- 基本上,window.close()只在window.open()启动的任何窗口时工作
- 在这里,我们首先重定向到同一个url,然后关闭,它工作了:)
以下代码对我有效:)
window.open('your current page URL', '_self', '');
window.close();
- 如何准确执行加载脚本&退出弹出窗口
- Chrome扩展:加载窗口后执行脚本
- 是否可以从弹出窗口触发内容脚本中的行为
- 在后台运行的脚本在出现弹出窗口时会停止
- 谷歌应用脚本打开新窗口
- 如何在运行php脚本后保持弹出窗口打开
- 鼠标悬停在脚本上时使用居中图像弹出窗口
- 用于从剪贴板中的表自动填充活动浏览器窗口中的字段的脚本
- 如果在外部单击,则隐藏弹出窗口.为什么我的脚本没有'不起作用
- InDesign CS5脚本:如何在“n”秒后打开和关闭弹出窗口
- 如何在Chrome扩展弹出窗口和内容脚本之间发送消息
- 多个独特的弹出窗口,带有JPopUp脚本
- 运行谷歌脚本网络应用后关闭窗口
- 从 vb.net 关闭脚本弹出窗口
- Photoshop 脚本 - 更新窗口中的进度条
- Chrome“脚本只能关闭由它打开的窗口”错误
- 当窗口大小小于 x 时使脚本停止
- 查找负责打开新窗口的脚本
- 从弹出窗口到内容脚本的 Chrome 扩展消息
- 使用多个窗口.脚本中的matchMedia