我有一些网络应用程序。它是基于桌面的。我有一个问题,在我保存数据之前操作被取消。我在 javascript 中使用 unload 事件将一些数据发送到 mixpanel(只是一些 ajax 调用)。问题是我相信这个请求有时会被“取消”。
有没有办法防止页面在我收到回调之前发生变化?我觉得答案是否定的,除非我能够使呼叫同步。我不认为我有 mixpanel 的能力。
我目前正在使用 mootools 中的卸载事件。我可能应该使用 beforeunload?有没有办法告诉卸载我完成了?
我有一些网络应用程序。它是基于桌面的。我有一个问题,在我保存数据之前操作被取消。我在 javascript 中使用 unload 事件将一些数据发送到 mixpanel(只是一些 ajax 调用)。问题是我相信这个请求有时会被“取消”。
有没有办法防止页面在我收到回调之前发生变化?我觉得答案是否定的,除非我能够使呼叫同步。我不认为我有 mixpanel 的能力。
我目前正在使用 mootools 中的卸载事件。我可能应该使用 beforeunload?有没有办法告诉卸载我完成了?
最简洁的答案是不。同步 ajax 似乎是这里唯一可靠的选择。
如果您正在控制客户端代码,则很容易使其同步。只需添加async: false
大量Request
选项。服务器不会在意的。
对于我们这些习惯于编写异步 ajax 的人来说,一个潜在的问题是:在处理程序完成Request.send()
之前,调用之后的任何内容都不会被执行onComplete
。这意味着诸如显示“请稍候...”之类的细节必须首先出现在代码中。对于异步请求,顺序显然无关紧要,通常先发送请求。
至于beforeunload
,它在这里可能没有用。的值beforeunload
是允许用户取消即将加载的页面。如果您不需要此功能,请使用unload
.
有一种更新的方法使用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”进行跟踪。即使用户切换到不同的选项卡也会触发此事件(不完全“关闭”页面。可能不是预期的),但如果移动浏览器用户打开不同的应用程序也会触发(可能是预期的,因为这几乎是在手机上“关闭”页面的主要方式)。