如何在页面关闭前执行ajax函数?

12

我正在开发一个 PHP/JavaScript 聊天应用。

当用户登录时,他/她的用户名会被插入到名为 queue 的 MySQL 表中。 这个插入语句返回 mysql_insert_id(),然后将其存储在一个名为 $_SESSION['CHAT_QUEUE_ID'] 的 session 变量中。

我需要在用户关闭页面时删除 MySQL 表中的行。

我尝试了以下方法,但没有成功:

js 文件

window.onbeforeunload = closeSession;
function closeSession(){
    $.ajax({
        url: "/chat/process/chat.php",
        type: "GET"
    });
    return "disconnected";
}

chat.php

$delete= "DELETE FROM queue WHERE id = " . $_SESSION['CHAT_QUEUE_ID'];
// query, etc
有没有办法做到这一点?

3
你知道吗,浏览器对于“onbeforeunload”功能的支持是有限的?例如Opera浏览器并不支持它。 - ckruse
我没有想到那个。有什么建议吗? - matheusvmbruno
2
常见的方法是定义一个超时时间。如果用户在特定时间内没有任何活动,他将被断开连接。 - ckruse
1个回答

21

你使用ajax异步(jquery-ajax的默认设置)进行请求。但是在 unload 事件中,浏览器不会等待任何东西。

尝试在 ajax-settings 中设置 async : false。但是不能保证这种方法在所有浏览器中都能有效。

请查看这里的评论: http://api.jquery.com/unload/#dsq-comment-body-132164390


它完美地运行了。之前应该想到这个...谢谢! - matheusvmbruno
2
另外,如果您正在触发与异步使用相同的功能ajax调用(或多个ajax调用),则可以在onbeforeunload语句中全局设置它们为异步: $.ajaxSetup({ async: false }); - JSP64
关于将async=false设置为async=true的有用后续:https://dev59.com/F2445IYBdhLWcg3w4-Fe#4651049 - René
你知道为什么我们要将它设置为同步吗?因为我们想要将数据发送到服务器,但不关心服务器的响应,因为数据已经传递了。 - TOPKAT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接