2012-03-14 72 views
10

我正在开发一个php/javascript聊天。如何在onbeforeunload上执行ajax函数?

当用户登录时,他/她的用户名将被插入名为queue的MySQL表中。 此插入返回mysql_insert_id()将存储在会话变量中称为$_SESSION['CHAT_QUEUE_ID']

我需要在用户关闭页面时删除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''限制该浏览器支持?例如。歌剧不支持它。 – ckruse 2012-03-14 12:17:32

+0

我没有想到这一点。任何建议? – matheusvmbruno 2012-03-14 12:50:41

+2

常用的方法是定义超时。如果用户在特定时间内没有进行任何活动,则会断开连接。 – ckruse 2012-03-14 12:52:59

回答

20

你开火你的ajax异步(jQuery的默认 - ajax)。但浏览器不会等待任何卸载。

尝试在ajax设置中设置async : false。但是你永远无法确定这个功能在任何浏览器中都能正常工作。

在这里看到评论: http://api.jquery.com/unload/#dsq-comment-body-132164390

+0

它完美的作品。应该在之前想到...感谢! – matheusvmbruno 2012-03-14 12:46:05

+0

不受欢迎matheusvmbruno – StilgarBF 2012-03-14 12:47:10

+2

另外 - 如果您触发的是异步使用的相同函数ajax调用(或多个ajax调用),则可以在onbeforeunload语句中将它们设置为全局异步: \t \t $ .ajaxSetup({ \t \t \t async:false \t \t}); – JSP64 2013-10-12 22:37:57