2009-11-16 51 views
3

我們是一個年輕的初創公司,下週推出一款獨特的聊天產品。我們的聊天目前基於Jabber(使用Openfire作爲我們的Jabber服務器),通過BOSH(使用旁遮普語)和jQuery用於我們的客戶端腳本。在瀏覽網站時保持與服務器的永久連接

現在我們當前設置最關鍵的問題是網站導航,當在我們的網站中瀏覽頁面時,BOSH連接將丟失,直到新頁面加載並且BOSH連接被認證。由於這個問題,我們必須設置一個非常大的超時時間(大約1分鐘),然後才能登出離開我們的網站而未登出的用戶。

我們知道基於JavaScript錨的導航解決方案,但實現這個需要對我們網站的標記,CSS和JS腳本進行很多更改,而且我們網站的結構非常複雜。

有沒有其他解決方案? 我在考慮基於幀的導航,當一個頁面將容納2個iframe - 一個隱藏並保存BOSH連接,另一個容納真正的頁面內容。這個解決方案的問題在於它會影響用戶的感受,並且地址欄中的URL將始終保留包含這些框架的頁面的URL。

有沒有解決我們的問題,不需要完全重寫網站的結構/標記?

在此先感謝!

+0

您是否考慮過Facebook使用它的聊天技術?或者說,你提到的「基於錨點的導航解決方案」。 – 2009-11-16 10:57:37

+0

是的,Facebook使用基於錨點的導航...這就是我所說的 – jitzo 2009-11-16 11:04:43

+1

這仍然是一個錯誤的混亂... – Shawn 2009-11-16 21:01:58

回答

1

雖然這可能不是一個完整的重寫,但我會說這需要一些操作。讓聊天框停留在那裏並在內容中添加ajax,也就是說,如果在Facebook上底部有聊天欄,則將其餘部分放在您將頁面放入的ajax中。換句話說,把你的佈局放在一邊,把它分開,並把你的鏈接變成ajax請求,這些請求可以通過全局鏈接處理程序處理,並通過搜索代替鏈接,通過sed替換所有文件。 (href =「changed to href =」javascript:urlhandler(但是這需要考慮外部鏈接) 我能想到的另一個選擇是在你的網站上有兩個iframe,主要和聊天。導航從頁面,D/C或任何將發生在他們身上

+0

感謝您的評論,關於第一個解決方案 - 它幾乎是我所說的「基於錨的導航」 - 減去錨將指示哪當前頁面(類似於Facebook/Gmail中的導航) - 如果我將通過JS代碼處理所有鏈接,並永久保留在同一頁面上 - 我仍然會遇到前面提到的問題 - URL將始終保持不變,刷新頁面/導航後退/書籤頁面時會導致問題)...此外,此解決方案需要進行一些重大更改... – jitzo 2009-11-17 10:51:42

+0

關於您的第二個解決方案 - 哪個在這個問題中提到 - 它將需要少得多的變化,但它有相同的URL的問題... – jitzo 2009-11-17 10:53:32

+0

一個窘境好先生,我會仔細看看,感謝信息:) – 2009-11-18 06:36:52

1

您是否在每個頁面上使用您的聊天實施?如果是這樣,答案是調整緩存爲您的腳本確保所有大的JS文件是外部的,並且服務器沒有註冊任何更改(例如:上次修改)。將圖像合併爲精靈。通過存在的許多縮小器之一運行代碼最後但並非最不重要的是,投資於CDN Amazon CloudFront既簡單又便宜:你會發現它可以提高性能的奇蹟。

0

你可以使用jQuery的歷史插件(http://www.mikage.to/jquery/jquery_history.html)來處理後退和前進的導航和加載頁面通過ajax就像你在談論。

像這樣的東西應該工作(未經測試):

Page1.htm:

<html> 
<head><title>Page 1</title></head> 
<body> 
    <div id="content"> 
     <a href="/page2.htm">Load Page 2</a> 
    </div> 
    <div id="chat"></div> 
</body> 
<script> 
    $(function(){ 
     function loadPage(hash){ 
      if($.browser.msie) { 
     hash = encodeURIComponent(hash); 
     } 
      $.ajax({ 
       "url":hash, 
       "success":function(response){ 
        var newPage = $(response); 
        document.title=newPage.find("title").html(); 
        $("#content").html(newPage.find("#content").html()); 
       } 
      }); 
      return false; 
     } 
     $.historyInit(loadPage); 
     $("a").live("click",function(){ 
      $.historyload(this.href); 
     }); 
    }); 
</script> 
</html> 

Page2.htm:

<html> 
<head><title>Page 2</title></head> 
<body> 
    <div id="content"> 
     <a href="/page1.htm">Load Page 1</a> 
    </div> 
    <div id="chat"></div> 
</body> 
<script> 
    $(function(){ 
     function loadPage(hash){ 
      if($.browser.msie) { 
     hash = encodeURIComponent(hash); 
     } 
      $.ajax({ 
       "url":hash, 
       "success":function(response){ 
        // this is just an example and not too efficient. 
        var newPage = $(response); 
        document.title=newPage.find("title").html(); 
        $("#content").html(newPage.find("#content").html()); 
       } 
      }); 
      return false; 
     } 
     $.historyInit(loadPage); 
     $("a").live("click",function(){ 
      $.historyload(this.href); 
     }); 
    }); 
</script> 
</html> 

如果你想工作外包給我,我我很樂意幫忙。 :o)

相關問題