做一个群组聊天页面

要做个群组聊天的页面,参考微信的web版本,大致就是分为左右两列,左边是群组列表,右边是群组中的对话

示例图如下:

 

这个页面风格是使用ACE做的,再次啧啧下,ACE真TMD强大,这个页面的风格很招人喜欢。

 

做这个页面刚开始的时候我走了弯路,初步想的是使用iframe,左侧群组聊天页面是页面加载的,右侧的群组对话框是个iframe。然后点击左侧的任意一个群组,右侧的对话iframe就修改src,然后更新对话的时候也超简单,直接iframe重新加载一下就ok了。

但是呢,后来发现,我这样需要写的controller反而更多,一个iframe的controller,一个页面本身的controller,然后在两个iframe需要传递一些东西,特别是群组id。最大的困难就是更新,当我在iframe中发了一条消息之后,iframe中的条目能很快更新,但是外面的页面(由于是使用轮询)就没办法及时更新了。

后来总结了下,我整个页面就使用最统一的方式,html+jsonp的形式,使用一个页面controller,然后每个行为触发一个jsonp,整体做下来,结果就是js量极速增大。但是,不算坏事。

 

页面逻辑是这样:

首先页面初始加载群组列表

其次点击群组名称,同步加载出现右侧的对话框。注意这里是使用同步加载。因为从用户体验上,如果使用异步,点击了群组却没有出现对话框,会有bug的感觉。jquery的ajax是有提供jsonp和同步调用的:

代码:

$("[name=talk_talk]").click(function(event){
    event.preventDefault();

    var target = event.target;
    var mgid = $(target).attr("data-mgid");
    var action = "http://api.test/group/messageList"
    var params = "mgid=" + mgid;

    $.ajax({
        type: "get",
        dataType: "jsonp",
        async:false,
        url: action,
        data: params,
        jsonp: 'callback',
        jsonpCallback: 'callback231',
        success: function(data) {
            if (data.msg == 'ok') {
                var messages = data.messages;
                var users = data.users;
                var message_contents = '';
                for(var i=0; i< messages.length; i++) {
                    var message = messages[i];
                    var sid = message.sid;
                    var sender = users[sid];
                    message.sender = sender;
                    message_content = getDialogHTML(message);
                    message_contents = message_contents + message_content;
                }
                $("#messages_show").html(message_contents);
                $("#messages_show").attr("cur_mgid", mgid);
                $("#group_unreadflag_" + mgid).hide();
                $("#widget-box-dialog").show();
            }
        }
    });
});

这里的ajax的dataType设置为jsonp表示是个jsonp请求,加上后面的jsonp和jsonpCallback,表示调用的时候我传递的请求带上了callback=callback231。

这里的jsonpCallback也是可以不写的,但是如果不写jquery会使用形如:callback_321342_324123这样的函数名来替换。但是我希望服务器端使用白名单机制来控制callback只能是字母和数字(Yii):

if (!empty($callback) && ctype_alnum($callback)) {
    echo "{$callback}(" . CJSON::encode($ret) . ")";
    Yii::app()->end();
}

所以我就手动设置了callback函数。相关的安全考虑我记得以前有一篇文章写过:http://www.cnblogs.com/yjf512/p/3222269.html

ajax的默认是异步的,所以要设置同步的话需要设置async:false。

 

接着就是轮询函数

服务端有个jsonp接口能根据我返回的最新时间,返回这个时间后我收到的所有群组消息。

代码几乎同上,不同的就是这个行为应该且必须是异步的。然后做两个事情:一件事情是如果左侧的群组有新消息,设置一个标志表示有新消息。另一个事情是如果右侧的对话显示的是当前这个群组的对话,就增加一个最新的消息放到上面。

 

然后是发送消息,基本同上。

好吧,主要还是秀一下ACE模板,看的爽。

时间: 2024-10-26 05:30:39

做一个群组聊天页面的相关文章

切换账号,群组聊天页面提示找不到次群组?

问题描述 解决方案 调用rest接口查询一下,看一下这个群组中是否有这用户id

Zulip 1.6 发布,功能强大的群组聊天软件

Zulip 1.6 发布了.Zulip 是一个强大的开源群组聊天软件. 用 Python 编写,使用 Django 框架,支持通过会话流的私人消息和群聊. Zulip 还支持快速搜索.拖放文件上传.图像预览.组私人消息.可听通知.错过电子邮件消息提醒,桌面应用等等. 更新内容: 已注销页面的完整视觉重新设计,包括登录,注册,集成等. 新的视觉设计为众多的 UI 元素,包括表情符号选择器,用户配置文件的边框,侧边栏,组合等等. Zulip 设置界面的完整重新设计看起来更优美,更容易浏览. 完整更新

ios 集成环信群组聊天功能需要导入哪些文件?

问题描述 ios 集成环信群组聊天功能需要导入哪些文件? 解决方案 把easeui拷贝进去,聊天就用easemessageviewcontroller就行解决方案二:恩,我自定义了一个控制器,继承的这个message控制器,但是发出去的消息别的用户收不到,发送成功失败的两个方法都不走,是为什么呢解决方案三:发送消息对面收不到,还是页面显示感叹号啊解决方案四:收不到,,没有感叹号解决方案五:可以收到安卓版本的同一个群里发来的消息

Android升级3.0以后,以前的群组聊天发图片会收不到,请问这是什么情况

问题描述 升级3.0以后,在以前建立的群组聊天里聊天,发送图片收到是一个什么都没有的消息,这是什么情况? 解决方案 嗯 如果升级到 sdk3.0的话 这个代码层的发送图片的代码 也需要参照下sdk3.0demo中的发送代码 自己修改下的.

gridview-我想做一个ASP.NET修改页面,点击修改,把选中的这一行的值,依次放入textbox控件中。

问题描述 我想做一个ASP.NET修改页面,点击修改,把选中的这一行的值,依次放入textbox控件中. 解决方案 http://blog.csdn.net/junboyboy/article/details/17922037 解决方案二: 推荐你看一下 高手写的GridView 72绝技 ,地址:http://blog.csdn.net/21aspnet/article/details/1540301

集成环信群组聊天功能,群消息设置不成功

问题描述 集成环信群组聊天功能,群消息设置不成功,屏蔽消息可以,接收不提醒设置不成功,,,设置完提示设置成功,但是再次进来的话还是没设置之前的状态,消息设置控制器用的环信的,环信demo可以,我的就不行,为什么呢? 解决方案 再次进来查看的时候先获取下群详情

mfc-老师让做一个VC++MFC聊天程序怎么实现发送图片?

问题描述 老师让做一个VC++MFC聊天程序怎么实现发送图片? VC++MFC聊天程序,我只会实现基本的文本对话功能,怎么实现发送图片?采用的是客户端/服务器模式.希望热心人帮帮忙啊! 解决方案 去查查对象的序列化和反序列化. 把图片序列化为一个字符串,把字符串发送过去,在接收端将此字符串反序列化为一个图片对象,然后显示. 解决方案二: 发送图片和发送文字的区别在于,一般文字是通过人工输入,然后程序获取并保存到内存变量或缓存中,通过SOCKET发送出去.而图片要么通过剪切板复制,或者读取硬盘中的

杀死APP进程,群组聊天的Message的unread状态会从true变成false

问题描述 大家好,我是Android开发者.当我收到一条群组聊天消息后,我先不打开,这时候EMMessage的属性unread肯定是true的.但是如果此时我在任务管理器中杀死这个APP进程,再进APP,发现刚才未读的EMMessage的属性unread变成了false.请大家帮忙提供思路,指出我可能是哪没处理好.谢谢 解决方案 接收到的Message的unread状态是true,这个状态是保存在内存中的,Message再次从数据库加载到内存就成为false了

请问怎么在REST接口 根据群组id去查下一个 群组的聊天记录?现在只看到了timestamp查询方法

问题描述 请问怎么在REST接口 根据群组id去查下一个 群组的聊天记录?现在只看到了timestamp查询方法 解决方案 没有通过过id导出的.调用rest接口是导出app所有的记录,报存到你自己服务器过滤