防止用户在多个标签中运行相同的javascript调用的最佳方法是什么?

时间:2017-06-10 18:47:55

标签: javascript ajax

我有通知系统通过名为notification-refresh.php的文件处理 AJAX 请求,该文件返回带有新通知的 JSON对象 - 如果存在。 因此,每个用户都会调用此文件将通知推送到浏览器。一切都很好,直到每个用户开始打开很多标签。每个标签请求3秒间隔内的文件。 请求数量过载服务器,我们暂时禁用了保存系统的功能。

那么,你们能帮助我吗?我不知道这是否可能,我只是寻找其他方法来通知系统仅使用 javascript PHP ,但未成功。

有没有办法阻止用户在多个标签中运行相同的JavaScript调用?也许在隐藏标签中停止刷新......

PS:这不是服务器方面的问题。即使我们禁用了通知功能,也只是过载的微小请求数量。

编辑:最终代码

你们所有人帮助了我很多,我找到了解决问题的快速解决方案。我会在这里留下代码,因为它可以在将来帮助人们(或不会)。

开始之前的事情:

  • 有一个名为canRefresh的全局变量,负责允许或拒绝访问refresh()函数;
  • 您不需要像我一样执行额外的功能,因为您可以通过一次调用获得标签焦点状态:document.hasFocus(),但如果您假装在代码的不同部分使用它,则建议使用它;
  • 我无法向您展示整个代码,抱歉。

    function check() {
    
         if(document.hasFocus() == canRefresh)
    
             return;
    
         canRefresh = !canRefresh;
    
    }
    

有效!再次感谢,伙计们!

2 个答案:

答案 0 :(得分:1)

我会看看this post

  1. 当页面加载时,创建一个本地存储对象,其时间戳对象为放入时的对象。
  2. 页面关闭时删除该本地存储对象
  3. 如果对象已存在(如果它早于一定时间),则启动刷新序列,并更新时间戳。这是因为浏览器崩溃了,并且没有清理它实际刷新的内容。
  4. 如果该对象不存在,请启动刷新过程。
  5. 您也可能想要查看websockets。如果用户与服务器建立了websocket连接,并且已经存在,则应该断开套接字(或者将更新推送到所有套接字,无论如何。应该相当轻量级。)

答案 1 :(得分:1)

使用事件onfocus()onblur()检查此标签是处于活动状态还是非活动状态。如果它处于活动状态(聚焦),则立即调用通知复习,否则停止向服务器调用请求。

var canCallRequest=true;
function refresh(){
  if(!canCallRequest) return;
  //request here...
};
window.onfocus = function () { 
  canCallRequest= true; 
  refresh();
}; 

window.onblur = function () { 
  canCallRequest = false; 
};