0

我有一些网络应用程序。它是基于桌面的。我有一个问题,在我保存数据之前操作被取消。我在 javascript 中使用 unload 事件将一些数据发送到 mixpanel(只是一些 ajax 调用)。问题是我相信这个请求有时会被“取消”。

有没有办法防止页面在我收到回调之前发生变化?我觉得答案是否定的,除非我能够使呼叫同步。我不认为我有 mixpanel 的能力。

我目前正在使用 mootools 中的卸载事件。我可能应该使用 beforeunload?有没有办法告诉卸载我完成了?

4

2 回答 2

1

最简洁的答案是不。同步 ajax 似乎是这里唯一可靠的选择。

如果您正在控制客户端代码,则很容易使其同步。只需添加async: false大量Request选项。服务器不会在意的。

对于我们这些习惯于编写异步 ajax 的人来说,一个潜在的问题是:在处理程序完成Request.send()之前,调用之后的任何内容都不会被执行onComplete。这意味着诸如显示“请稍候...”之类的细节必须首先出现在代码中。对于异步请求,顺序显然无关紧要,通常先发送请求。

至于beforeunload,它在这里可能没有用。的值beforeunload是允许用户取消即将加载的页面。如果您不需要此功能,请使用unload.

于 2012-08-18T03:34:29.247 回答
1

有一种更新的方法使用navigator.sendBeacon. 下面设置了一个混合面板事件,用于离开页面。

var props = {};
document.addEventListener('visibilitychange', function() {
    if (document.visibilityState === 'hidden') {
        mixpanel.track('Page closed', props, {transport: 'sendBeacon'});
    }
});

{transport: 'sendBeacon'}是 2020 年 1 月之前 mixpanel js 中可用的东西,正如这个 github 问题中所讨论的那样。该讨论中有(建议的,在实施之前)片段,但我认为它应该说“beforeunload”而不是“unload”。但后来我发现...

navigator.sendbeacon 上的developer.mozilla.org 文档包含一个非常相关的部分,建议使用“visibilitychange”而不是“unload”或“beforeunload”进行跟踪。即使用户切换到不同的选项卡也会触发此事件(不完全“关闭”页面。可能不是预期的),但如果移动浏览器用户打开不同的应用程序也会触发(可能预期的,因为这几乎是在手机上“关闭”页面的主要方式)。

于 2021-07-22T22:57:16.483 回答