如何在onbeforeunload上执行ajax函数?

Posted

技术标签:

【中文标题】如何在onbeforeunload上执行ajax函数?【英文标题】:How to execute ajax function onbeforeunload? 【发布时间】:2012-03-30 21:34:11 【问题描述】:

我正在开发一个 php/javascript 聊天。

当用户登录时,他/她的用户名被插入到名为queuemysql 表中。 此插入返回mysql_insert_id(),该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

有什么办法吗?

【问题讨论】:

您知道浏览器对onbeforeunload 的支持是有限的吗?例如。 Opera 不支持。 我没有想到这一点。有什么建议吗? 常用的方法是定义一个超时时间。如果用户在特定时间内没有活动,他就会断开连接。 【参考方案1】:

你触发你的 ajax 异步(默认为 jquery - ajax)。但浏览器不会等待卸载任何内容。

尝试在 ajax 设置中设置 async : false。但是您永远无法确定这是否每次都适用于所有浏览器。

在此处查看评论: http://api.jquery.com/unload/#dsq-comment-body-132164390

【讨论】:

完美运行。之前应该想到的...谢谢! 另外——如果你触发了与异步使用相同的功能性 ajax 调用(或多个 ajax 调用),你可以在 onbeforeunload 语句中将它们全局设置为异步:$.ajaxSetup( async:假); 关于将 async=false 重置为 async=true 的有用后续操作:***.com/a/4651049/449444 你知道为什么我们必须将其设置为同步吗?因为我们想要的是向服务器发送数据但不关心服务器响应,因为数据已传递?

以上是关于如何在onbeforeunload上执行ajax函数?的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 中的 window.onbeforeunload ajax 请求

js阻止页面刷新

bug-3——onload,onbeforeunload,Onunload的区别

刷新或关闭时调用onbeforeunload

onbeforeunload 支持检测

如何使用 AJAX 刷新 Django 页面的一部分?