2016-04-29 66 views
0

我有一個彈出窗口,如果我刷新它失去unbeforeunload回調。將unbeforeunload方法綁定到刷新彈出窗口的正確方法是什麼?將unbeforeunload方法再次綁定到刷新的彈出窗口

var url = ..., 
    title = ..., 
    params = [ 
    "height=" + screen.height, 
    "width=" + screen.width, 
    "fullscreen=yes", 
    "resizable=yes", 
    "scrollbars=yes", 
    "toolbar=yes", 
    "menubar=yes", 
    "location=yes" 
    ].join(","); 

    var popup = window.open(url, title, params), 
     onbeforeunloadCallback = function (e) { 
        var isRefresh = this.opener.title == undefined; 

        if (isRefresh) { 
        // It doesn't work for second refresh 
        // so what am I doing wrong ? 
        console.log("It is refreshing"); 

        popup.onbeforeunload = onbeforeunloadCallback; 
        } 
     }; 

popup.onbeforeunload = onbeforeunloadCallback; 

回答

0

最後,下面的代碼解決了我的問題。請注意,下面的函數在ajax調用成功之內,所以data.ParametersGuid是從ajax返回的值。我也使用這個值來區分多個彈出窗口,如下面的代碼所示:

var url = ..., 
    title = ..., 
    params = [ 
    "height=" + screen.height, 
    "width=" + screen.width, 
    "fullscreen=yes", 
    "resizable=yes", 
    "scrollbars=yes", 
    "toolbar=yes", 
    "menubar=yes", 
    "location=yes" 
    ].join(","); 

var isRefresh = false, 
popup = window.open(options.url, options.title, params), 
getCurrentPopup = function() { 
    var possibleCurrentPopupHandler = $.grep(window.popups, function (o) { return o.id === data.ParametersGuid }), 
     currentPopup = possibleCurrentPopupHandler.length > 0 ? possibleCurrentPopupHandler[0].popup : null; 

    return currentPopup; 
}, 
setPopupCallbacks = function (p) { 
    p = p != null ? p : getCurrentPopup(); 

    if (p == null) return; 

    console.log("setPopupCallbacks -----"); 

    p.onload = onloadCallback; 
    p.onbeforeunload = onbeforeunloadCallback; 
    p.onunload = onunloadCallback; 
    p.onkeydown = onkeydownCallback; 
}, 
onloadCallback = function (e) { 
    console.log("I'm in onloadCallback func"); 

    setPopupCallbacks(); 
}, 
onbeforeunloadCallback = function (e) { 
    if (isRefresh) { 
     console.log("I'm refreshed in onbeforeunloadCallback func"); 

     isRefresh = false; 
     setPopupCallbacks(); 
    } else { // popup is being closed 
     console.log("I'm about to close in onbeforeunloadCallback func"); 

     window.popups = $.grep(window.popups, function (o) { return o.id !== data.ParametersGuid }); 
     element.clientModel.deleteSessionParameters(data.ParametersGuid); 
    } 
}, 
onunloadCallback = function (e) { 
    console.log("I'm in onunloadCallback func"); 

    setTimeout(function() { setPopupCallbacks(); }, 500); 
}, 
onkeydownCallback = function (e) {  
    var ctrlRClick = e.keyCode == 65 && e.ctrlKey, 
     f5Click = (e.which || e.keyCode) == 116; 

    isRefresh = ctrlRClick || f5Click; 
}; 

setPopupCallbacks(popup); 

window.popups = window.popups || []; 
window.popups.push({ 
    id: data.ParametersGuid, 
    popup: popup 
});