2009-11-16 53 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)

相关问题