如何从开启者断开JavaScript弹出窗口

时间:2013-08-08 08:29:00

标签: javascript html window.open window.opener

我正在从我的主页面打开一个弹出窗口,其代码如下:

<a href="http://external.domain.tld/"
   onclick="window.open(this.href, '_blank', 
       'width=512,height=512,left=200,top=100');return false">
 Open popup
</a>

这很好用,但我的问题是弹出窗口中加载的文档有权更改开启窗口的位置。当弹出窗口中的文档来自不同的域时,这甚至可以工作。它无权读取位置,但允许更改位置。我不希望这样。我希望弹出窗口与我的主页完全断开。

即使没有JavaScript它也不起作用。当我使用target="_blank"属性在新标签页中打开其他页面时,仍然允许此标签导航到opener窗口并更改其位置:

<a href="http://external.domain.tld/" target="_blank">
  Open in new tab
</a>

这是打开的文档中的代码,不应该被允许:

<script>
  opener.location.href = "http://badsite.tld/";
</script>

您可以看到实时演示here。单击两个链接中的一个以在弹出窗口或新选项卡中打开另一个页面,然后在开启窗口中加载第三个页面。这就是我想要阻止的。

是否有一些技巧可以用来打破开启窗口和打开的窗口之间的连接?理想情况下,打开的窗口不应该知道任何其他窗口都打开了它。

2 个答案:

答案 0 :(得分:14)

如果子窗口中的页面在您的控件中,您可以为子页面中的开启者指定null:

window.opener = null;

将此作为javascript中的第一个语句。

如果页面不在您的控件中或位于其他域中,请在打开时执行:

popup = window.open(this.href, '_blank', 'width=512,height=512,left=200,top=100');
popup.opener = null;

答案 1 :(得分:1)

来自doc:

  

在某些浏览器中,rel =&#34; noopener&#34;原始锚点上的属性   tag将阻止设置window.opener引用。

查看所有支持的浏览器: https://caniuse.com/#search=noopener

此外,对于旧版浏览器,请使用no-referrer: https://mathiasbynens.github.io/rel-noopener/

因此,只要您使用alter procedure [dbo].[sp_ClientCount] ( @DateFrom as datetime, @DateTo as datetime, @ClientCount as int = null ) as begin if @ClientCount IS NULL return 0 select count(ClientID) from tblClients where ClientID IN ( select ClientID from tblReqPayment where somedate between @DateFrom and @DateTo group by ClientID having count(*) = @ClientCount ) end

,修复就会rel="noreferrer noopener"