来自卸载事件的同步AJAXpost:如何确保用户在下一页加载时从数据库中看到最新的信息

当用户请求编辑我们CMS中的条目时,我们“锁定”它以便其他人无法同时编辑它,我们在提交更改时释放锁定。 但是我们需要处理用户通过其他链接离开页面的情况……我的第一次尝试是使用jQuery在$(window).unload上触发同步$.ajax()调用。 这确实有效,但是在用户看到的下一页上,条目似乎被锁定(假设它们返回列出所有条目的页面,可能通过后退按钮)。 对该页面的简单刷新表明该条目已准备好再次编辑。

我的猜测是,无论出于何种原因,浏览器在完全处理ajax请求之前获取下一页。 问题是,是否有办法确保事情以正确的顺序发生。

 var fire_unload_ajax = true; // certain things set this to false, not relevant $(window).unload(function() { if(fire_unload_ajax && $("#reset-entry-lock form").length == 1) { $.ajax({ url: window.location.href, async: false, cache: false, type: "POST", data: $("#reset-entry-lock form").serialize() }); } }); 

我在最近写的一个app中解决了类似的问题。

我最终在我的应用程序中每个页面的加载事件中检查了代码,检查用户是否仍然有锁并在不再需要时释放它们。 如果用户导航到我的应用程序之外的页面,我也有像你这样的代码在卸载事件上发布锁定。

对于Opera用户(等),我原本打算让锁每分钟自动过期,并且每隔30秒从我的应用程序执行异步回发以更新锁。 这样,即使未触发unload事件,在其他地方导航的用户也会释放其锁。 不幸的是,我的项目在实施之前就被取消了。

您可以每隔五分钟左右使用异步AJAX POST发送表单状态,就像Gmail在编写邮件时所做的那样。 正如我在评论中解释的那样,你不能依赖于onbeforeunload