2011-11-14 50 views
3

我想從使用JavaScript的子窗口關閉父窗口,但它不會工作。是否可以從子項(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> 

請幫助我..

+0

你在父窗口內使用iframe嗎?你想關閉'iframe'中的父窗口? – steveyang

+0

不,我沒有在父窗口內使用任何iframe –

+0

您可以包含您正在使用的代碼和/或JSFiddle嗎?列出的解決方案似乎應該可以工作,但它們並不適合你。添加代碼 – jbrookover

回答

7

window.close() MDN

這種方法只允許被調用時打開的窗口通過使用window.open方法的腳本執行 。如果腳本未打開窗口 ,則JavaScript控制檯中會顯示以下錯誤: 腳本可能無法關閉未由腳本打開的窗口。

您可以從父級關閉子窗口,但不能反過來。

+0

@丹尼斯......非常感謝您給出正確答案......... –

+0

是的你可以。請看我的答案。 – Rodolphe

+0

如果您使用Firefox,則可以在您自己的瀏覽器中禁用此限制。訪問'about:config',然後將'dom.allow_scripts_to_close_windows'設置爲'true'。現在,在您的瀏覽器中,'window.close()'將在所有窗口中運行。 –

0
function closeAll() 
{ 
    window.opener.justClose(); 
} 
+0

它不起作用....我試過了 –

+0

父窗口是你的嗎?你有控制它嗎? –

+0

立即嘗試 - 我編輯 –

0

如果你的意思是父框架內的子幀,然後用

window.parent.close(); 

如果你的意思是打開的窗口(與window.open()),那麼試試這個

window.opener.close(); 
+0

它也行不通 –

0

有一個可行的解決方案(在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> 

剛嘗試一下!

+0

這不適用於Firefox或Chrome。在IE7中,它會首先提示用戶。 – Dennis

+0

我剛剛在Chrome中試過它,它沒有詢問任何東西就關閉了父窗口(儘管我不知道爲什麼,你必須在按鈕上單擊兩次)。但你說得對:它在Firefox和IE中不起作用。 – Rodolphe

+0

它關閉了子窗口。它需要兩次點擊,因爲它第一次嘗試關閉父項(由於安全措施而失敗)並將'self'分配給'window.opener'。第二次嘗試關閉「自我」,根據我在我的回答中引用的MDN文檔,這是有效的。 – Dennis

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

用子頁面超時調用上面的函數。它適用於IE,有時也適用於Chrome。

setTimeout(closeW,500);

+0

「有時也在Chrome中」聽起來太粗略無法使用 –

0

已更新答案 讓孩子關閉父母是不好的偶合。我原來的答案只是因爲我的父窗口本身是通過祖父窗口通過JavaScript打開的!

爲避免偶然耦合,正確的方法是讓父窗口使用setInterval爲觸發關閉的事件輪詢子項。在這個例子中,該事件是子窗口關閉。我實際上使用它來刷新頁面的一部分,而不是關閉窗口,但原理是一樣的...

 $('#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'; 
+0

你有沒有任何運行的例子來顯示這個工作? – SilverlightFox

+0

我在Intranet系統上使用這種方法進行工作。 – AntonChanning

+1

對我不起作用 – kirtan403

0

你可能想試試這個

window.opener.close()