如何在页面卸载/离开时发送AJAX请求

How do I send an AJAX request upon page unload / leaving?

本文关键字:AJAX 请求 离开 卸载      更新时间:2023-09-26
window.onbeforeunload = function() {
    return $j.ajax({
        url: "/view/action?&recent_tracking_id=" + $recent_tracking_id + "&time_on_page=" + getSeconds()
    });
}

这是我所拥有的,但它返回一个警报[object object]

我如何执行AJAX?

注意:当我不返回任何东西时,服务器不会显示它正在接收ajax请求。

您不需要返回任何东西,只需触发ajax调用。

window.onbeforeunload = function(e) {
    e.preventDefault();
    $j.ajax({ url: "/view/action?&recent_tracking_id=" + $recent_tracking_id + &time_on_page=" + getSeconds()
    });
}

如果你使用的是jQuery,你可以尝试绑定到。unload()事件。

onbeforeunload允许您返回一个字符串,该字符串显示在'您想要离开'确认中。如果不返回任何内容,则正常退出该页。在本例中,您将返回由JQuery ajax方法返回的jqXHR对象。

您应该只执行Ajax调用而不返回任何内容。

为什么要返回函数对全局池的引用?应该是这样的:

window.onbeforeunload = function() {
 $j.ajax({
    url: "/view/action?&recent_tracking_id=" + $recent_tracking_id + "&time_on_page=" + getSeconds()
 });
}

据我所知,onbeforeunload函数只会返回一个警告。这样做是为了防止几年前烦人的弹出窗口。

我正在构建一个聊天客户端一段时间后,我能想出这样做的唯一方法是做一个setInterval函数,更新时间戳,然后检查超时用户并删除它们。这样,在一定时间间隔内没有"签到"的用户将被其他仍在登录的用户从房间中移除。

不漂亮,也不理想,但却奏效了。

在页面卸载处理程序中执行标准ajax调用被浏览器主动禁用,因为等待它完成会延迟窗口中发生的下一件事(例如,加载新页面)。

罕见的情况下,当您需要在用户从页面导航时发送信息时(正如Aaron所说,尽可能避免这种情况),您可以使用sendBeaconsendBeacon允许您将数据发送到服务器,而无需占用您正在执行的页面:

window.addEventListener("unload", function() {
  navigator.sendBeacon("/log", yourDataHere);
});

浏览器将发送数据,而不会阻止/延迟窗口中发生的任何事情(关闭窗口,移动到新页面等)。

注意unload事件可能不可靠,特别是在移动设备上。您也可以将上述操作与在visibilitychange上发送信标结合起来。