从子窗口关闭父窗口是否可能?(Javascript)

4

我正在尝试使用JavaScript从子窗口关闭父窗口,但它无法正常工作。

如果您有任何代码,请与我分享。

我的父HTML:

<script>
    var winr;
    var selfw;
    function openAn(){
        selfw=self.window;
        winr=window.open("shell.htm","");

    }

    function justClose(){
        //setTimeout("closeAfterMin()",2000);

        winr.close();
    }

    function closeAfterMin(){
        alert("sd");
        selfw.close();
    }

</script>
<body onload='openAn()' >
    <h1>New Web Project Page</h1>
</body>

我的孩子 HTML:

 <script>
        function closeAll(){
               window.parent.close();


        }

    </script>
    <body>
        <div onclick="closeAll();" onunload="window.opener.close();">
            Close Parent and self
        </div>
    </body>

请帮助我...

你是否在父窗口中使用了 iframe?并且你想在 iframe 中关闭父窗口? - steveyang
我没有在父窗口中使用任何iframe。 - Tushar Ahirrao
你能否包含你正在使用的代码和/或JSFiddle?已列出的解决方案似乎应该可以工作,但它们对你来说并没有起作用。 - jbrookover
JavaScript 只能关闭它打开的窗口。由于您的父窗口很可能不是由 JavaScript 打开的,因此无法通过 JavaScript 关闭它。 - RoToRa
@TusharAhirrao 你不使用IFRAME元素吗? - Šime Vidas
@ŠimeVidas,请检查我发布的代码...我没有使用IFrame。 - Tushar Ahirrao
7个回答

8

来自window.close() MDN:

这个方法只允许被用于通过window.open方法由脚本打开的窗口。如果该窗口不是由脚本打开的,则会在JavaScript控制台中出现以下错误: Scripts may not close windows that were not opened by script.

您可以从父窗口关闭子窗口,但反过来则不行。


可以的。请看我的回答。 - Rodolphe
如果您使用的是Firefox浏览器,您可以在自己的浏览器中禁用此限制。访问“about:config”,然后将“dom.allow_scripts_to_close_windows”设置为“true”。现在,在您的浏览器中,“window.close()”将在所有窗口中起作用。 - Rory O'Kane

2

你也许想要尝试这个

window.opener.close()

1
function closeW() {
   window.open('javascript:window.open("", "_self", "");
   window.close();', '_self');
}

使用子页面并设置超时调用上述函数。它在IE中有效,有时也在Chrome中有效。 setTimeout(closeW, 500);

“有时在Chrome中也会出现”听起来太不可靠了,不能使用。 - Thomas Mulder

1

更新的回答 让一个子窗口关闭父窗口是不好的耦合。我的原始答案之所以有效,是因为我的父窗口本身是由一个祖先窗口通过javascript打开的!

正确的做法是避免不必要的耦合,让父窗口使用setInterval轮询子窗口,以获取触发关闭的事件。在这个例子中,该事件是子窗口关闭。我实际上使用这种方法来使用ajax刷新页面的一部分,而不是关闭窗口,但原理是相同的...

        $('#open_child').click( 
        function(e) {
          e.preventDefault(); 
          docs_popup = window.open($('#open_child').attr('href'),'upload_doc');

          var timer = setInterval(function() {   
              if(docs_popup.closed) {  
                  window.close();
              }  
          }, 1000); 

          return false; 
        } );

原始答案 实际上有一个相当简单的解决方法。

创建一个什么也不做只是关闭自己的页面,例如 close.html

<!DOCTYPE html>
<html>
    <head>
        <script>window.close();</script>
    </head>
    <body>
        <p>This window should close automatically.</p>
    </body>
</html>

然后在子窗口中,将打开者重定向到关闭自身的页面:

window.opener.location.href='close.html';

你有任何运行的例子能展示这个工作吗? - SilverlightFox
我曾在公司的内部网络系统中使用过这种方法。 - AntonChanning

0
如果您指的是父框架内的子框架,则使用以下代码:
window.parent.close();

如果您的意思是指已打开的窗口(使用 window.open()),那么请尝试这个。
window.opener.close();

-1
function closeAll()
{
    window.opener.justClose();
}

父窗口是你的吗?你有控制权吗? - Royi Namir
我改成了 opener,你注意到了吗? - Royi Namir

-1

有一个可行的解决方案(至少在Chrome中):

这是父页面的代码:

<html>
<head>
<script type="text/javascript">

function openChild() {
    var w = window.open("parent_close_child.html", "child");
}

</script>
</head>
<body>

<input type="button" value="Open" onclick="openChild()" />

</body>
</html>

这是子页面的代码:

<html>
<head>
<script type="text/javascript">

function closeParent() {
    var w = window.opener;
    window.opener = self;
    w.close();
}

</script>
</head>
<body>

<input type="button" value="Close parent" onclick="closeParent()" />

</body>
</html>

试一下吧!


这在Firefox或Chrome中不起作用。在IE7中,它会首先提示用户。 - Dennis
我刚在Chrome中尝试了一下,它会在不询问任何内容的情况下关闭父窗口(虽然我不知道为什么,您必须点击两次按钮)。但是你是对的:它在Firefox和IE中不起作用。 - Rodolphe
它关闭了子窗口。需要两次点击,因为第一次尝试关闭父窗口(由于安全措施而失败),并将self赋值给window.opener。第二次尝试关闭self,根据我在答案中引用的MDN文档是有效的。 - Dennis
好的,没错。但是我想我们可以调整这段代码,让它在第一次点击时就能正常工作。所以在Chrome中有解决方案,但其他浏览器没有。 - Rodolphe
1
如果这个能够工作,那很可能是一个bug,并且你不能期望它在未来版本中继续工作。 - RoToRa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接