window.close()没有't工作-脚本可能只关闭它打开的窗口

window.close() doesn't work - Scripts may close only the windows that were opened by it

本文关键字:窗口 脚本 没有 close 工作 window      更新时间:2023-09-26

当我试图通过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()
}

它是如何工作的

  1. 基本上,window.close()只在window.open()启动的任何窗口时工作
  2. 在这里,我们首先重定向到同一个url,然后关闭,它工作了:)

以下代码对我有效:)

window.open('your current page URL', '_self', '');
window.close();