2014-10-12 284 views
3

我有一個打開多個窗口的Web應用程序。我的問題是當父窗口關閉/刷新時,子窗口保持打開狀態。 我試過使用onunloadonbeforeunload,但它們都沒有捕捉窗口關閉事件(在Chrome和Firefox中)。 我有一個窗口的數組,但刷新後,對它們的引用丟失。父窗口關閉時關閉所有子窗口

有什麼其他的方式來抓住這個事件嗎?

這是我的代碼與關窗(運行closeAll()unloadonbeforeunload關閉我所有打開的窗口,但不刷新頁面時):

window.unload = function() { 
    closeAll(); 
} 
window.onbeforeunload = function() { 
    closeAll(); 
} 

var closePopup = function(popup) { 
    removePopup(popup); 
    popup.close(); 
}; 

var closeAll = function() { 
    for (var popup in _this.popups) { 
     closePopup(_this.popups[popup]); 
    } 
} 

這僅適用於Chrome,但不能在Firefox和IE(最新版本)。

+1

*「我用onunload的和onbeforeunload試過,但他們沒有抓住窗口關閉事件(在Chrome和Firefox)」 *'onbeforeunload'絕對不會在Firefox和Chrome的工作。 – 2014-10-12 12:13:37

+0

「*其中沒有一個[發現]窗口關閉事件*」這一事實表明您的代碼中存在錯誤,因爲正如T.J.克勞德指出,他們在那些命名的瀏覽器中工作。你可以向我們展示你的嘗試,那麼我們可以幫忙。 – 2014-10-12 12:15:08

+0

似乎這個代碼適用於Chrome,但不適用於Firefox和IE。測試了這些事件之外的'closeAll'函數,它起作用。我也發現這裏有多個參考,它不適用於Firefox和其他瀏覽器http://stackoverflow.com/questions/14645011/window-onbeforeunload-and-window-onunload-is-not-working-in -firefox-safari-o http://stackoverflow.com/questions/20773306/mozilla-firefox-not-working-with-window-onbeforeunload – flaviu 2014-10-12 12:52:58

回答

1

找到了適當的溶液(jQuery的),在瀏覽器,Firefox和IE的最新的版本的工作原理。

最初想使用jQuery $().unload()函數(http://api.jquery.com/unload/),但自1.8(http://bugs.jquery.com/ticket/11733)開始不推薦使用。由於$().unload()$().bind('unload', fn)的快捷方式,我嘗試使用基本的一個,它工作。

$(window).on('unload', function() { 
    closeAll(); 
}); 
+0

但它只關閉父窗口,子窗口沒有關閉 – clarifier 2016-01-06 13:30:19

+1

@clarifier這可能是因爲closeAll()函數需要在所有彈出窗口對象實例中運行一個循環,並在它們上調用close()。 – Sawtaytoes 2016-04-13 19:24:59

2

使用本

var popup = window.open("popup.html", "popup", "width=200,height=200"); 

window.onunload = function() { 
    if (popup && !popup.closed) { 
     popup.close(); 
    } 
}; 
+0

我有一個窗口數組,我稱之爲closeAll()函數,我認爲我的代碼與您的解決方案類似,但它僅適用於Chrome。發現有關Chrome瀏覽器以外的迴應http://stackoverflow.com/questions/14645011/window-onbeforeunload-and-window-onunload-is-not-working-in-firefox-safari-o所以我不知道如果您的解決方案是跨瀏覽器的。 – flaviu 2014-10-12 12:47:22

1

如果你打開所有的子窗口window.open,包括此javascript中的所有頁面,然後CLOSEALL(假);將關閉所有子頁面,孫子頁面,grand-grand ...等等,並將第一個(根)頁面重定向到login.aspx,並且不會干擾任何事件觸發器,因爲它爲初始處理程序奠定了基礎。

function CloseAll(bTopFound) 
{ 
    if (!bTopFound && nParent != null && !nParent.closed) { 
     //parent window was not closed 
     nParent.CloseAll(false); 
     return; 
    } else { 
     if (nParent == null || nParent.closed) 
     { 
      top.location = '/login.aspx'; 
     } 
    } 

    for (var i = 0; i < Windows.length; i++) 
    { 
     if (!Windows[i].closed) { 
      Windows[i].CloseAll(true); 
     } 
    } 
    nParent = null; 
    setTimeout(window.close, 150); 
} 

var Windows = []; 
//override window.open to inject store child window objects 
window.open = function (open) { 
    return function (url, name, features) { 
     // set name if missing here 
     name = name || "default_window_name"; 
     var newWindow = open.call(window, url, name, features); 
     Windows.push(newWindow); 
     return newWindow; 
    }; 
}(window.open); 

var nParent = null; 
window.onload = function (load) { 
    return function (e) { 
     nParent = window.opener; 
     if (load != null) { 
      load.call(e); 
     } 
    } 
}(window.onload); 

window.onunload = function (unload) { 
    return function (e) { 
     //promote first branch page to parent 
     if (nParent != null && !nParent.closed && Windows.length > 0) { 
      nParent.Windows.push(Windows[0]); 
      Windows[0].nParent = nParent; 
     } 
     //make first child window new root 
     for (var i = 1; i < Windows.length; i++) { 
      Windows[i].nParent = Windows[0]; 
      Windows[0].Windows.push(Windows[i]); 
     } 
     if (unload != null) { 
      unload.call(e); 
     } 
    } 
}(window.onunload);