[英]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 的窗口的類似問題。 我需要檢查窗戶何時關閉。 我嘗試了以下:-
我使用了 window.onunload 事件,由於同源策略,它不起作用並顯示以下錯誤
錯誤:嘗試在已清除的范圍內運行 compile-and-go 腳本源文件:chrome://firebug/content/net/httpLib.js
錯誤:嘗試在已清除的范圍內運行 compile-and-go 腳本源文件:chrome://firebug/content/firefox/tabWatcher.js
但是我維護了一個 Window 對象數組並應用了“Window.closed”屬性,它甚至在跨域中也能工作。 :)
您也可以嘗試postMessage API或CORS
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.