如何捕获浏览器窗口关闭事件?

khe*_*lll 142 javascript browser jquery events

我想捕获浏览器窗口/选项卡关闭事件.我用jQuery尝试了以下内容:

jQuery(window).bind(
    "beforeunload", 
    function() { 
        return confirm("Do you really want to close?") 
    }
)
Run Code Online (Sandbox Code Playgroud)

但它也适用于表单提交,这不是我想要的.我想要一个仅在用户关闭窗口时触发的事件.

SLa*_*aks 201

beforeunload当用户出于任何原因离开您的页面时,该事件将触发.

例如,如果用户提交表单,单击链接,关闭窗口(或选项卡)或使用地址栏,搜索框或书签转到新页面,则会触发它.

您可以使用以下代码排除表单提交和超链接(除了其他框架):

var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });

$(window).on("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})
Run Code Online (Sandbox Code Playgroud)

对于早于1.7的jQuery版本,请尝试以下方法:

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})
Run Code Online (Sandbox Code Playgroud)

live方法不适用于该submit事件,因此如果添加新表单,则还需要将处理程序绑定到该表单.

请注意,如果其他事件处理程序取消了提交或导航,则如果稍后实际关闭该窗口,您将丢失确认提示.您可以通过记录submitclick事件中的时间来解决这个问题,并检查是否beforeunload会在几秒钟后发生.

  • 好的,工作得很好!较新版本的jquery支持$('form').live('submit,function(){}). (8认同)
  • 您的解决方案很好,但如果刷新,我该如何取消活动?我只想在浏览器关闭的情况下才能使用该事件,无需刷新 (4认同)
  • 使用Ctrl + r,F5,Ctrl + Shift + r并更改浏览器URL来处理页面刷新吗? (2认同)

kar*_*m79 44

也许只是解除beforeunload窗体submit事件处理程序中的事件处理程序:

jQuery('form').submit(function() {
    jQuery(window).unbind("beforeunload");
    ...
});
Run Code Online (Sandbox Code Playgroud)

  • @awe但是你需要在每个表单中包含`onsubmit = ...`.(我在每个页面都有很多表单,在某个webapp中) (4认同)
  • 通过在表单标签定义中指定它,这不是很容易不使用jQuery吗?:`<form onsubmit ="window.onbeforeunload = null;"> (3认同)

des*_*esm 15

对于跨浏览器解决方案(在Chrome 21,IE9,FF15中测试),请考虑使用以下代码,这是Slaks代码的略微调整版本:

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind('beforeunload', function(eventObject) {
    var returnValue = undefined;
    if (! inFormOrLink) {
        returnValue = "Do you really want to close?";
    }
    eventObject.returnValue = returnValue;
    return returnValue;
}); 
Run Code Online (Sandbox Code Playgroud)

请注意,自Firefox 4以来,消息"你真的要关闭吗?" 没有显示.FF只显示一般消息.请参阅https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload中的注释

  • 这个在浏览器中一致地工作.只是一个快速的说明; 我将`live`和`bind`语句更新为`on`,它与最新级别的jQuery一起使用.谢谢! (3认同)

Beh*_*adi 11

window.onbeforeunload = function () {
    return "Do you really want to close?";
};
Run Code Online (Sandbox Code Playgroud)


zur*_*fyx 5

我的回答旨在提供简单的基准。

如何

请参阅@SLaks 答案

$(window).on("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})
Run Code Online (Sandbox Code Playgroud)

浏览器需要多长时间才能最终关闭您的页面?

每当用户关闭页面(x按钮或CTRL+ W)时,浏览器都会执行给定的beforeunload代码,但不会无限期地执行。唯一的例外是确认框 ( return 'Do you really want to close?),它将等待用户的响应。

:2 秒。
火狐:?(或双击,或强制关闭)
边缘:?(或双击)
Explorer 11:0 秒。
Safari :待办事项

我们用来测试的内容:

  • 带有请求日志的 Node.js Express 服务器
  • 以下简短的 HTML 文件

它所做的是在浏览器关闭其页面(同步)之前发送尽可能多的请求。

<html>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script>
    function request() {
        return $.ajax({
            type: "GET",
            url: "http://localhost:3030/" + Date.now(),
            async: true
        }).responseText;
    }
    window.onbeforeunload = () => {
        while (true) {
            request();
        }
        return null;
    }
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

铬输出:

GET /1480451321041 404 0.389 ms - 32  
GET /1480451321052 404 0.219 ms - 32  
...  
GET /hello/1480451322998 404 0.328 ms - 32

1957ms ? 2 seconds // we assume it's 2 seconds since requests can take few milliseconds to be sent.
Run Code Online (Sandbox Code Playgroud)