代码之家  ›  专栏  ›  技术社区  ›  Ty W

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

  •  3
  • Ty W  · 技术社区  · 15 年前

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

    我的猜测是,无论出于什么原因,浏览器都会在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()
            });
        }
    });
    
    2 回复  |  直到 10 年前
        1
  •  2
  •   Kramii    14 年前

    我在最近写的一个应用程序中解决了类似的问题。

    我在加载事件中使用了代码 每一个 我的应用程序中的页面,它检查用户是否仍有锁,如果不再需要锁,则将其释放。我也有类似你的代码,在卸载事件中释放锁,以防用户导航到我的应用程序之外的页面。

    对于Opera用户(等等),我本来打算让锁每分钟自动过期一次,然后每隔30秒从我的应用程序异步回发一次以更新锁。这样,即使卸载事件没有被触发,导航到其他地方的用户也可以释放锁。不幸的是,我的项目在实施之前被取消了。

        2
  •  0
  •   Marcel Korpel    15 年前

    您可以使用异步Ajax日志每隔五分钟左右发送一次表单状态,就像Gmail在编写消息时那样。正如我在评论中解释的,你不能依赖 onbeforeunload .