2015-02-07 69 views
0

我正在开发一个非常类似于在线考试的网站,并且我想要设计一种方法,以便我可以向用户指出他们当前是否已连接或断开与我的服务器。为此,我经常ping我服务器上的一个空文件,以确定连接是否可用。该代码看起来是这样的 -如何指示用户是否在客户端上线

$(document).ready(function(){ 
//Defining the function 
var req = function() { 
    $.ajax({ 
     url : 'ping.php', 
     error: function(){$("#circle").css("background","red");}, 
     complete : function() { 
      $("#circle").css("background","green"); 
      req(); 
     } 
    }); 
}; 

//Calling the function 
req(); 

//Rest of my code 

}); 

现在,我的理解是,只要调用完成,圆将是绿色的,如果发生错误,它会变成红色,而Ajax调用将停止。我的问题如下:

  1. 有没有更好的方法来做到这一点?例如,Google或Facebook如何标记在线用户?

  2. 这个递归Ajax调用会以任何方式降低/减慢我的服务器吗?

注意:它实际上并不是我的服务器。我没有管理权,所以这是一个主要关心的问题。

请帮我看看这里。谢谢!

+0

我的一个建议是遏制你的ping。每5秒一次可能足够快。你可以用setTimeout(req,5000)来做到这一点。在你完整的回调中。 – bhspencer 2015-02-07 21:39:58

+1

请注意,如果您获得成功和错误,完成将触发,因此在您的情况下,您始终将背景设置为绿色。你应该设置背景为绿色的成功,只调用req在完整的 – bhspencer 2015-02-07 21:42:41

+1

你应该尽量只做头部请求,http://stackoverflow.com/questions/333634/http-head-request-in-javascript-ajax,这将使其对客户端连接和您的服务器EASY有效负载。看看这个https://developer.mozilla.org/en/docs/Online_and_offline_events它可能不适用于所有设备和浏览器:( – 2015-02-07 21:47:07

回答

0

1)你应该用超时限制你的ping。这将减少服务器上的负载。这可以用setTimeout来完成。

2)您应该只将圆圈设置为绿色成功。完成成功和错误的攻击,所以你总是会看到代码中的绿色。

$(document).ready(function(){ 
//Defining the function 
var req = function() { 
    $.ajax({ 
     url : 'ping.php', 
     success : function(){$("#circle").css("background","green");}, 
     error: function(){$("#circle").css("background","red");}, 
     complete : function() { 
      setTimeout(req, 5000); 
     } 
    }); 
}; 

//Calling the function 
req(); 

//Rest of my code 

}); 

琐事的附加位代码在技术上并不递归的后续调用在事件循环的下一个事件的发生。也就是说,在下次调用req()之前,先前的req调用实际返回。如果这是一个传统的递归调用,您将不会无休止地用您的代码将调用放在堆栈上。

+0

理解了这一点,但我已经测试过它,它有时会变红,这是怎么发生的? ? – Razor 2015-02-07 22:05:10

+0

我不确定,jQuery文档说“完成:当请求完成时(在执行成功和错误回调后),将调用一个函数”http://api.jquery.com/jquery.ajax/ – bhspencer 2015-02-07 22:16:53

相关问题