簡體   English   中英

來自父窗口的跨域 window.close 事件

[英]Cross-domain window.close event from parent window

例如,我在域 1 上:

a.click(function(){
  window.win=window.open(domain2,'name');
});

現在我在 domain2 上,我正在關閉它。 window.win如何知道用戶關閉了那個窗口? 是否有任何事件或屬性可以通過間隔檢查?

有一個屬性不屬於任何 W3C 規范。 它被稱為closed並且可以像訪問一樣被訪問

if( window.win.closed ) {
    // window was closed
}

我不確定該屬性的跨瀏覽器兼容性。 我也不確定這在跨域域上的表現如何。 但是如果你嘗試一下,請讓我和這個社區的其他人知道它。


另一種選擇是您自己處理通知。 這意味着,您正在偵聽彈出窗口中的onbeforeunload 當事件觸發時,您可以使用 HTML5 的postMessage方法在跨域窗口之間進行通信。 例如:

主窗口:

window.addEventListener('message', function(e) {
    if( e.origin === 'http://www.popupdomain.com' ) {
        if( e.data === 'closed' ) {
            alert('popup window was closed');
        }
    }
}, false);

域2:

window.onbeforeunload = function() {
    window.opener.postMessage('closed', 'http://www.popupdomain.com');
};

此解決方案的唯一警告是它僅與支持基本 HTML5 的瀏覽器兼容。 還有其他(偷偷摸摸的)方法可以在舊瀏覽器上進行跨域通信,但我想那是另一回事了。

您可以通過對 windows 關閉屬性使用間隔檢查來檢查跨域是否已關閉。

var url = "http://stackoverflow.com";
var width = 500;
var height = 500;
var closeCheckInterval = 500; //Check every 500 ms.

var popup =  window.open(url, "_new", 'width=' + width + ', height=' + height);
popup.focus();

var closeCheck = setInterval(function () {
    try {
        (popup == null || popup.closed) && (clearInterval(closeCheck), onWindowClosed());    
    } catch (ex) { }
}, closeCheckInterval);

var onWindowClosed = function () {
    ...
    // Stuff to do after window has closed
    ...
}

我正在研究從域 2 打開域 1 的窗口的類似問題。 我需要檢查窗戶何時關閉。 我嘗試了以下:-

  1. 我使用了 window.onunload 事件,由於同源策略,它不起作用並顯示以下錯誤

    錯誤:嘗試在已清除的范圍內運行 compile-and-go 腳本源文件:chrome://firebug/content/net/httpLib.js

    錯誤:嘗試在已清除的范圍內運行 compile-and-go 腳本源文件:chrome://firebug/content/firefox/tabWatcher.js

  2. 但是我維護了一個 Window 對象數組並應用了“Window.closed”屬性,它甚至在跨域中也能工作。 :)

  3. 您也可以嘗試postMessage APICORS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM