2011-12-13 41 views
0

好吧,我試着做一個聊天應用程序,用戶如果他們登錄到網站可以相互聊天。除了一點我不能寫的工作之外,我已經設立了一切。如何刷新每X秒的服務器或數據庫表值

在我的例子:2名的用戶彼此聊天:用戶A和用戶B

當用戶A提交在聊天窗口中的註釋,然後將含有評論整個DIV應該不僅在用戶刷新A方面,而且在用戶B方面,以便當用戶A提交評論時,用戶B應該能夠看到它。

簡而言之,當新記錄添加到數據庫表時,刷新每個用戶頁面上的div。

我很擅長PHP,JQuery,AJAX。

+0

看看這個問題: http://stackoverflow.com/questions/7604129/jquery-update-div-the-moment-a-table-is-updated/7604207#7604207 – Terry 2011-12-13 18:56:06

+0

總之你們必須知道Facebook的LIVE通知如何工作。每次用戶做某事。一個新的記錄被添加到實時通知div中。如果有人發表了評論,則對方的用戶也會立即看到評論,即使他不刷新頁面。這與「如果添加新記錄時刷新div」有關。但經過長時間的編碼後,我無法達到這種效果。 P.S:我需要一個簡單的Ajax + PHP代碼。因爲我確定它的東西很小,但我不能得到結果。 – Samir 2011-12-14 00:17:49

回答

0

如果您很樂意限制您的用戶使用新技術,那麼最好的方法是查看HTML5 websocket API。它在鰓的周圍還是有點綠色,但它確實是這些事情在不久的將來會完成的方式。實際上,Kaazing的默認示例是聊天客戶端。

在服務器端,有JavaScript(Node.js),Java和其他技術的websockets實現,但我不確定PHP。

如果您不想使用websockets,名爲「COMET」或搜索「長輪詢」的研究技術。這些將比一段時間間隔更具響應性。

另一方面,如果您不需要它是超級響應,您可以使用setInterval讓兩個客戶端都輪詢服務器以進行更改。

+0

總之,你們必須知道Facebook的直播通知是如何工作的。每次用戶做某事。一個新的記錄被添加到實時通知div中。如果有人發表了評論,則對方的用戶也會立即看到評論,即使他不刷新頁面。這與「如果添加新記錄時刷新div」有關。但經過長時間的編碼後,我無法達到這種效果。 P.S:我需要一個簡單的Ajax + PHP代碼。因爲我確定它的東西很小,但我不能得到結果。 – Samir 2011-12-14 00:18:29

+0

很難描述如何看到每個答案中同樣的評論副本+粘貼。 ;-)我們都給了你有效的答案。在一個setInterval調用中(比如說,每1000毫秒?)創建一個Ajax請求,以實現資源密集且響亮的響應時間。沒有奇蹟......只有websockets提供與服務器的雙工通信。其他任何事情都是輪詢服務器以獲取新數據的巧妙變體。 – 2011-12-14 03:57:34

2

每隔x秒使用Ajax檢查新消息,如果有新消息,則將其寫入div。

服務器無法告訴客戶發佈了新消息。客戶端必須詢問服務器。

+0

總之,你們必須知道Facebook的實時通知是如何工作的。每次用戶做某事。一個新的記錄被添加到實時通知div中。如果有人發表了評論,則對方的用戶也會立即看到評論,即使他不刷新頁面。這與「如果添加新記錄時刷新div」有關。但經過長時間的編碼後,我無法達到這種效果。 P.S:我需要一個簡單的Ajax + PHP代碼。因爲我確定它的東西很小,但我不能得到結果。 – Samir 2011-12-14 00:18:01

0

如果您正在尋找AJAX輪詢解決方案,DC的答案是正確的。這可以通過一個簡單的JavaScript Interval完成。

但是,由於會有大量重複的內容請求,因此輪詢對資源來說並不輕鬆,並且您需要經常輪詢以使聊天感覺像實時一樣。

如果你想從服務器推送數據到客戶端,我會考慮使用web套接字編寫這個應用程序。 NodeJS對於你想要實現的內容是完美的,取決於你想要支持的瀏覽器。

0

你需要超時功能,像這樣:

function updateChatWindow(){ 
    var xhr = $.ajax({ 
     url : /* controller url */, 
    }) 
    .done(function(response){ 
     /** do something with the response the server gave you back **/ 
    }); 
    .fail(function(response){ 
     /** handle a lost connection is some way, maybe show a message to the user, or retry request */ 
    }) 
    .then(function(){ 
     periodicRefresh(); 
    }); 
} 


var timeoutFunction; //idealy, this will be inside a javascript object 
//starts a refresh (in 500ms) 
function periodicRefresh(){ 
    timeoutFunction = setTimeout(updateChatWindow,500); 
} 
//stops the refresh from happening, see below why 
function clearRefresh(){ 
    clearTimeout(timeoutFunction); 
} 

var inputElement = $(/** the input area where the user types text **/); 
inputElement.keyup(function(e){ 
    if(e.keyCode==13){ // or whatever the e.???==13 was to check for enter 
     clearRefresh(); 
     /** submit new chat line **/ 
     updateChatWindow(); 
}); 

updateChatWindow(); 

回顧:

1)有一個Ajax調用,將更新窗口
2)有將在它存儲的定時器功能超時變量將觸發內容刷新(從1開始的ajax調用)
3)有能力取消該請求(因爲用戶鍵入文本,並且在他們點擊輸入後,無論如何都應該刷新聊天窗口)
4)有能力以某種方式停止超時功能以允許3)發生。