【问题标题】:Javascript close windowJavascript关闭窗口
【发布时间】:2018-12-26 10:50:52
【问题描述】:

我在page_a.php 中有一个链接,它使用target="_blank" 在新标签页中打开。

 <a href="page_b.php" target="_blank">Open Page B</a>

在页面 B 我有一个脚本,一旦用户不再查看它,它将自动关闭选项卡/窗口。我的脚本如下所示:

<script type="text/javascript">
    function handleVisibilityChange() {
      if (document.visibilityState == "hidden") {
        window.close();
        console.log("hidden");
      } else {
        console.log("shown");
      }
    }
    document.addEventListener('visibilitychange', handleVisibilityChange, false);
</script>

所以我有:

 localhost/test/page_a.php //loads jQuery
 localhost/test/page_b.php //doesn't load jQuery

page_b.php 我收到警告:

脚本只能关闭它打开的窗口。

既然我实际上是打开窗户的人,有没有办法让它工作?

【问题讨论】:

标签: javascript php tabs dom-events dom-manipulation


【解决方案1】:

必须使用 JavaScript 的 window.open() 打开窗口,而不是使用 &lt;a href="..." target="..."&gt; 链接。有关详细信息,请参阅 window.close() 文档。

例如,一种方法是侦听链接上的click 事件,阻止默认操作,然后使用 JavaScript 显式打开窗口:

<script type="text/javascript">
  // wait for the DOM to have loaded
  document.addEventListener( 'DOMContentLoaded', function( e ) {
    let link = document.querySelector( 'some selector to get the proper link element' );
    link.addEventListener( 'click', function( e ) {
      // prevent window opening regularly
      e.preventDefault();
      // explicitly open with JavaScript
      window.open( this.href, 'MyNewWindow' );
    } );
  } );
</script>

不过,这可能存在问题:

  1. 您的用户可能已将浏览器配置为阻止打开新窗口。
  2. 如果用户通过单击链接以外的其他方式访问page_b.php,则关闭窗口也不起作用。您必须使用window.opener 显式测试该窗口是否被您的另一个窗口打开:

    <script type="text/javascript">
      /*
         ...
      */
      // if this window has a reference to the window that opened this window
      if( window.opener ) {
        document.addEventListener('visibilitychange', handleVisibilityChange, false);
      }
    </script>
    

    但正如您在文档中看到的那样,window.opener 也有其自身的问题。

【讨论】:

  • 完美!我只是将onclick="{e.preventDefault(); window.open( this.href, 'MyNewWindow' );}" 添加到我的&lt;a&gt;if( window.opener ) 到page_b。谢谢你的详细回答。
  • @DvirLevy 是的,这也很有效,不客气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
相关资源
最近更新 更多