2015-02-07 25 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

相關問題