2012-09-19 43 views
2

我有一個html5/javascript應用程序,其中多個用戶可以查看任何給定時間的同一組數據。爲了一個真實世界的例子,可以說它是一個日曆類型的頁面。Javascript最佳實踐:同步瀏覽器Windows

因此user1正在尋找瀏覽器打開並查看日曆頁面,user2也在日曆頁面上。 User2對日曆進行了更改,我希望(儘快)對這些更改進行識別並在用戶1的屏幕上刷新。做這個的最好方式是什麼?

我正在考慮爲活動用戶提供一個mysql表,用於存儲他們當前所在的頁面以及上次更新的時間戳,然後使用ajax調用每隔幾秒鐘ping服務器並檢查更新的時間戳,如果它比客戶端更新,那麼新數據將被髮送並且頁面「重新加載」。我重新加載引號,因爲實際的瀏覽器窗口不會被刷新,但一個函數將通過JavaScript調用,將重新加載頁面。堆棧溢出的方式執行其更新檢查,但不是告訴用戶頁面已更改,並提供一個按鈕來重新加載,它應該自動發生。如果user1在日曆上工作,似乎它可能是相當惱人的user2的屏幕不斷刷新...

這是一個可怕的想法?每隔幾秒發出一次ajax請求就會對服務器進行ping操作,從而導致嚴重的慢速崩潰?有一個更好的方法嗎?我希望用戶端的觀點是實時的,因爲重要的是user1不能更新user2已經更改的日曆頁面上的元素。

更新:基於一些網絡套接字研究,它似乎不是一個合適的解決方案。首先它與舊版瀏覽器不兼容,我支持ie8 +,第二我不需要實時更新網站上的所有用戶。該網站是一個基於帳戶的應用程序,一個帳戶可以有多個用戶。數據只需要在這些用戶之間同步。任何其他建議都會很棒。

回答

2

你需要這個實時應用程序。你應該看看socketio。每次用戶登錄時,都會讓他監聽服務器上的更改。然後,當服務器上的內容發生變化時,每個用戶都將收到通知。 你可以在官方網站上找到例子:http://socket.io/

+0

我寧願推出我自己的解決方案。任何想法這種事情是如何工作的,所以我可以研究如何開始在自己的代碼中實現類似的方法? – ryandlf

+0

Socket.io在這裏是最好的選擇。 長輪詢 - 你所描述的比socket.io的websocket解決方案慢。 另外一個經驗法則是:插入數據時mysql很慢,不應該用於像你所建議的那樣的實時應用程序。 如果您想部署持久層研究Redis,CouchDB,MangoDB或一般NoSQL解決方案。 中間件選擇:Node.js和Websockets。 – Mirko

+0

那麼也許使用某種靜態列表而不是mysql?我應該提到我使用java作爲後端,並且已經編寫了一個應用程序,而不使用nosql,節點或任何第三方解決方案。我現在無法真正實現它們,因爲它意味着基本上會重寫整個應用程序。 – ryandlf