微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 防止浏览器卡在AJAX请求上

我正在尝试在用户关闭页面时发送请求.我正在使用onbeforeunload事件.

选项卡关闭页面刷新时会触发事件.我的活动如下:

window.onbeforeunload = function () {
    $.ajax({ //jQuery
        type: "POST",
        url: "offline.PHP",
        data: {
            logout: 'false'
        }
    });
}; 

offline.PHP(这不是完整的脚本):

...
unset($_SESSION["onpage"];
if ($_POST['logout'] == "false") {
    sleep(3);
    if (isset($_SESSION["onpage"]) || !empty($_SESSION["onpage"])) die();
}
...

用户关闭页面时,脚本会取消设置在聊天页面上的会话.三秒钟后,脚本应检查用户是否已返回但是检查onpage会话.但是,当我按下刷新按钮时会出现问题.刷新时,页面无法加载,因为三秒钟已完成.这导致我的整个系统被破坏.

我试过添加ignore_user_abort(true);但它没有解决我的问题.有没有其他办法让这个工作?

旁注:这是聊天.当用户关闭页面时,它应该通过“用户已离开”消息通知聊天中的其他用户.这不应该在刷新时显示.当用户返回该页面时,它应该通知用户已经返回“用户已输入”消息的其他用户.

Chat

解决方法:

问题

我担心你试图做的事情实际上是不可能的,因为很多时候onbeforeunload都不会被调用,因为浏览器实现,用户偏好,你的宠物斑马会把你的电脑从桌面上敲下来等等.

从Mozilla的beforeunload文档:

Note also that varIoUs mobile browsers ignore the result of the event (that is, they do not ask the user for confirmation). Firefox has a hidden preference in about:config to do the same. In essence this means the user always confirms that the document may be unloaded.

https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload

解决方

但这并不意味着处理用户下线是不可能的.

大多数聊天Web应用程序使用心跳(常规的类似ping的请求),并使用最后一次ping之间的距离来确定用户断开连接.另外需要注意的是,我建议允许一个比三秒钟更宽的窗口来确定用户断开连接,因为有很多原因导致ping可能无法在三秒钟内完成.

实施战略

您有几个选项来实现ping.最常见的是,人们将使用window.setTimeout来调用ping,这将在完成或失败时重新启动window.setTimeout,通常会使连续失败的延迟加倍,因此您不会阻止可能过载的服务.

setTimeout为Ping:

var i = 1000;

(function ping() {
  $.ajax({
    type: "POST",
    url: "ping.PHP"
  }).done(function() {
    i = 1000;
    window.setTimeout(ping, i);
  }).fail(function() {
    i = i * 2;

    if (i > 60000) {
      // We don't wait to wait longer than a minute
      i = 60000;
    }

    window.setTimeout(ping, i);
  });
}());

相反,window.setInterval怎么样?我的代码不会更短吗?

请不要这样做.我上面关于“禁止超载服务”的说明?如果你那样做会更糟糕.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐