2013-05-12 138 views
0

我正在研究像Facebook这样的消息系统。我确实留下了一个对话列表,并在右侧的一个框中加载消息,就像Facebook一样。Ajax消息系统问题

基本系统是完整的(PHP/MySQL的),这里它是如何构建的一些信息:


  • getUserMessages.php - 从在用户和用户选择的已记录之间数据库消息获取。它的输出HTML准备好显示。

现在系统是部分支持Ajax,我希望它是,就像Facebook的一样。

目前的Ajax化的部分是:

当用户vieweing的对话,它会自动显示新邮件,同时还更新了最后一条消息会话列表。

如果用户没有查看对话,它会收到新消息并更新对话列表。

这是用PUSH服务完成的,为用户提供实时体验。

我想改善这一点,并使其以这样的行动:

用户点击对话列表,并将其加载在右边框的消息,同时也改变了地址栏中的网址, withut重新加载整个页面。

我可以很容易做到,当用户点击对话加载邮件的一部分,但我开始之前,我有两个问题:

如何更改地址URL,同时显示用户会话WITHOUT重新加载页面?
我找到了答案。

2.我如何缓存对话?因此,如果两个会话之间的用户切换,它不会再次调用PHP文件,并在数据库中查询所有消息,但追加仅新邮件(通过另一个PHP文件可能获取唯一的未读邮件)

编辑

我COMED了一个解决方案:

当用户打开一个对话,我缓存整个Ajax响应(即HTML)的一个变量,如messages-n,其中n是的user_id该选择对话,然后如果用户再次点击该对话,我检查是否设置了messages-n,如果是,我打印它并运行ajax请求以仅获取未读消息并追加它们。 这只是在我的脑海里,我没有把它变成实际的代码。

可以正常工作吗?

+0

也许你可以将消息保存在一个数组中。当用户切换到已经加载的对话时,这些消息直接显示给他。您可以使用消息的id(或其时间戳)来仅从数据库中获取未读消息。 – Christopher 2013-05-12 17:38:51

+0

@Christopher我用类似的解决方案编辑了我的问题,查看它。 – Fr0z3n 2013-05-12 17:54:01

+0

我认为这应该工作。只有一件事:我不会用html回答ajax调用。为什么不使用xml或json并在客户端创建html?这将使您能够针对不同的显示类型使用相同的脚本(例如对话预览或更大的屏幕等) – Christopher 2013-05-12 18:00:42

回答

0

解决1/2:

要更改地址URL我使用的是HTML5 .pushState()事件。

由于HTML5浏览器以不同的方式实现pushState方法,为了使用跨浏览器解决方案,并且使用散列回退支持HTML4浏览器,我使用了Hystory.js

2.要缓存消息,我还没有找到解决方案,我现在也没有尝试过。 但正如@Christopher所建议的,我将Ajax响应从HTML更改为Json。 如果我找到它,我会更新我的答案。