window.onbeforeunload在chrome中不起作用

时间:2011-01-26 06:50:39

标签: onbeforeunload

这是我用于window.onbeforeunload ......

的代码
<head>
<script>

    window.onbeforeunload = func;

    function func() 
    {
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = stateChanged;
        request.send(null);
    }
    function stateChanged()
    {
        if (request.readyState == 4 || request.readyState == "complete")
            alert("Succes!");
    }
    </script>
    </head>

这适用于IE和mozila但不适用于镀铬.....请帮助...... 提前谢谢.....

10 个答案:

答案 0 :(得分:17)

在最近的Chrome版本中,你唯一能用onbeforeunload做的就是设置警告信息。

window.onbeforeunload = function () {
    return "Are you sure";
};

会工作吗? Chrome中

似乎忽略了该函数中的其他代码

更新:自Chrome V51起,将忽略返回的字符串,并显示默认消息。

答案 1 :(得分:11)

知道我已经迟到了,但是为什么我的自定义beforeunload消息在Chrome中无法正常工作并且正在阅读此内容。因此,如果其他人也这样做,则从版本51开始的Chrome不再支持beforeunload上的自定义消息。显然,这是因为该功能被各种骗局滥用。相反,您会收到预定义的Chrome消息,该消息可能适合您的用途,也可能不适更多详情:

https://developers.google.com/web/updates/2016/04/chrome-51-deprecations?hl=en#remove-custom-messages-in-onbeforeload-dialogs

个人认为他们所选择的消息并不是很好,因为它提到离开网站并且onbeforeunload最常见的合法用途之一是脏网处理/检查网页表单所以它不是一个好的措辞在很多时候用户仍然会在你的网站上,只是错误地点击了取消或重新加载按钮。

答案 2 :(得分:4)

在chrome 21.0.1180.79

上确认了此行为

这似乎与XSS一样有效,如果你刷新页面或在同一个域+端口上打开一个执行脚本的页面,否则它只会在你返回一个字符串时执行(或类似的) )将显示一个对话框,询问用户是否要倾斜或留在页面中。

这是一个令人难以置信的愚蠢事情,因为onunload / onbeforeunload不仅用于询问/阻止页面更改。

在我的情况下,我也使用它保存页面编辑期间完成的一些更改,我不想阻止用户更改页面(至少chrome应该尊重返回true或更改页面而不询问返回是否不是字符串),脚本运行时间限制将被采用。

这在chrome中特别烦人,因为在卸载页面时onblur事件不会发送到编辑元素,chrome只是简化了curent页面并跳转到另一个页面。因此,保存更改的唯一变化是卸载过程,如果没有STUPID问题,如果用户想要更改它,现在就无法完成...当然他想要并且我不想阻止...

希望Chrome很快能以更优雅的方式解决这个问题。

答案 3 :(得分:3)

试试这个,它对我有用:

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};

答案 4 :(得分:3)

您应该尝试以下操作:

window.onbeforeunload = function(e) {
  e.returnValue = 'onbeforeunload';
  return 'onbeforeunload';
};

此功能适用于最新的Chrome。我们遇到了同样的问题,e.returnValue的值为onbeforeunload解决了我的问题。

您的代码应如下所示:

    <head>
    <script>

    window.onbeforeunload = function(e) {
        e.returnValue = 'onbeforeunload';
        func();
        return ''onbeforeunload'';
    };

    function func() 
    {
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = stateChanged;
        request.send(null);
    }
    function stateChanged()
    {
        if (request.readyState == 4 || request.readyState == "complete")
            alert("Succes!");
    }
    </script>
    </head>

答案 5 :(得分:1)

试试这个。我试过了,它的确有效。有趣但成功消息不需要像其他消息那样确认。

window.onbeforeunload = function() 
{
    if ( window.XMLHttpRequest )
    {
        console.log("before"); //alert("before");
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = function () {
            if ( request.readyState == 4 && request.status == 200 )
            {
                console.log("Succes!"); //alert("Succes!");
            }
        };
        request.send();
    }
}

答案 6 :(得分:0)

当前版本的Chrome需要设置事件的returnValue属性。只需从事件处理程序返回一个字符串就不会触发警报。

addEventListener('beforeunload', function(event) {
  event.returnValue = 'You have unsaved changes.';
});

答案 7 :(得分:0)

我在MacOS High Sierra上运行Chrome,并且有一个Angular 6项目,我在处理window.beforeunload一个window.onbeforeunload事件。您可以做到,对我有用:

handleUnload(event) {
  // Chrome
  event.returnValue = true;
}

当我尝试将字符串放入event.returnValue时,它显示了一个错误,它需要一个布尔值。

答案 8 :(得分:0)

以上都不对我有用。我在卸载事件之前从内容脚本->后台脚本发送消息。起作用的是当我在清单中将persistent设置为true时(实际上,您可以完全删除该行):

"background": {
    "scripts": [
        "background.js"
    ],
    "persistent": true
  },

此SO问题here解释了逻辑。

答案 9 :(得分:0)

不知道它是否允许在浏览器上显示自定义消息。

<script type="text/javascript">
    window.addEventListener("beforeunload", function(e) {
        e.preventDefault(); // firefox
        e.returnValue = ''; // Chrome
    });
</script>