Internet Explorer上的Javascript onbeforeunload问题

时间:2018-04-11 10:07:51

标签: javascript internet-explorer tabs onbeforeunload

这是我的剧本:

<script type="text/javascript">
    var redirectFlag = false;
    if (+localStorage.tabCount > 0) {
        alert('Already a tab or window opened!');
        redirectFlag = true;
    } else {
        redirectFlag = false;
        localStorage.tabCount = 0;
    }
    localStorage.tabCount = +localStorage.tabCount + 1;
    window.onbeforeunload = function () {
        localStorage.tabCount = +localStorage.tabCount - 1;
    };
    if (redirectFlag) {
        var baseUrl = window.location.origin;
        window.location.href = baseUrl + 'mylocation';
    }
</script>

我想检查是否打开了另一个标签。这个脚本适用于firefox和chrome。但是在IE 11上,window.onbeforeunload被忽略了。

是否有针对IE执行此操作的解决方法?谢谢

2 个答案:

答案 0 :(得分:2)

beforeunload事件有几个已知问题。以下是其中一些:

  

将事件处理程序/侦听器附加到窗口或文档的beforeunload事件可防止浏览器使用内存页面导航缓存,例如Firefox's Back-Forward cacheWebKit's Page Cache

     

为了防止不需要的弹出窗口,浏览器可能无法显示在beforeunload事件处理程序中创建的提示,除非页面已与之交互,或甚至可能根本不显示

     

参考:https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload

如果目标浏览器支持,建议使用pageHide event。您可以在此处找到它的支持:https://caniuse.com/#search=pagehide

因此,您应该使用localStorage.tabCount而不是减少onbeforeunload事件处理程序中的onpagehide

window.onpagehide = function () {
  localStorage.tabCount = +localStorage.tabCount - 1;
};

您可以尝试使用以下代码笔查看它是否适合您: https://codepen.io/Nisargshah02/pen/eMXMGE?editors=1011

我不完全确定你的方法 - 即如果保持localStorage的计数是理想的。在过去,我使用了一个库Crosstab来实现这个目的,事实证明它是可靠的。

注意:通过类似属性的访问者localStorage.tabCount访问localStorge项目是一种不好的做法。您可能遇到的一个常见问题是有人会覆盖getItemsetItem等系统方法。

答案 1 :(得分:0)

这种方式适用于IE11和最新的firefox,chrome。没有检查歌剧,边缘,野生动物园或网景。

<script type="text/javascript">
    //only when an order is created
    var redirectFlag = false;
    if (+localStorage.tabCount > 0) {
        alert('Already a tab or window opened!');
        redirectFlag = true;
    } else {
        localStorage.tabCount = 0;
    }
    localStorage.tabCount = +localStorage.tabCount + 1;
    //works for firefox;chrome;ie11
    window.addEventListener('onpagehide', function (evt) {
        localStorage.tabCount = +localStorage.tabCount - 1;
    });
    //redirect user if there are 2 tabs/windows opened
    if (redirectFlag) {
        var baseUrl = window.location.origin;
        window.location.href = baseUrl + 'myurl';
    }
</script>