window.onbeforeunload没有在Chrome中触发但在Firefox

时间:2016-11-03 12:35:00

标签: javascript jquery google-chrome

我有一个主窗口和一个弹出窗口。弹出窗口在主窗口中创建。

类似parent.php是主窗口。在这个页面上,我有一个JavaScript函数来重新加载页面,如下所示:

function popUpClosed() {
  window.location.reload();
}

我们可以从parent.php打开弹出窗口。现在,当我们关闭/导航弹出窗口时,我想从弹出窗口中popUpClosed()执行parent.php函数。

我尝试过以下方法来实现同样的目标。

方法1

window.onunload = window.onbeforeunload = function() {
  if(window.opener && !window.opener.closed) {
    window.opener.popUpClosed();
  }
};

方法2

window.onbeforeunload = Call;

function Call() {
  if(window.opener && !window.opener.closed) {
    window.opener.popUpClosed();
  }
}

方法3

window.onpagehide = function() {
  window.opener.popUpClosed();
}

除了谷歌浏览器之外,每个浏览器都能正常运行。 Chrome没有启动任何功能。

然而,这是在过去2-3天内发生的。之前所有的事情都在Chrome中运行良好。 (可能是由于最新的Chrome更新造成的)

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

最新的Google Chrome浏览器存在window.opener问题。最新版本中会忽略window.opener处理程序内的beforeunload/unload导航。但是有一个解决方法。请尝试以下代码:



var btn = document.getElementById("btn");

function detectClick(event) {
  var wind = window.open('urlhere', 'name', 'width=' + screen.width/2 + ', height=' + screen.height/2);
  wind.onbeforeunload = function(){ 
    popupClosed(wind);
  }
}
btn.addEventListener("click", detectClick, false);

function popupClosed(wind) {
  setTimeout(function() {
    wind.opener.location.href = window.location.href;
  }, 0);
}

<input id= "btn" type="button" value="open popup" />
&#13;
&#13;
&#13;

这个代码是否会在这里执行堆栈溢出但是同时工作:ChromeMozilla Firefox通过jsfiddle或服务器执行。

以下是有效的代码: jsfiddle

here是错误报告的链接,用于确认beforeunload/unload handler问题。

答案 1 :(得分:-3)

您可以尝试以下代码:

我已经创建了打开POP上窗的常用功能:

function PopupCenter(url, title, w, h) {
        var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;
        var dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;

        width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
        height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;

        var left = ((width / 2) - (w / 2)) + dualScreenLeft;
        var top = ((height / 2) - (h / 2)) + dualScreenTop;

        child = window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);

        if (child.focus) {
            child.focus();
        }
    }

为了检查子窗口是否关闭,我使用的是setInterval函数,并检查以下间隔:

function checkChild() {
    if (child != undefined && child.closed) {
            //alert("Child window closed");
            clearInterval(timer);
            location.reload();
        }
    }

DEMO