做一个群组聊天页面

简介:

要做个群组聊天的页面,参考微信的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模板,看的爽。





本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3782587.html,如需转载请自行联系原作者

相关文章
|
26天前
|
前端开发
一键复制微信聊天框效果:HTML+CSS让网页聊天更生动!
一键复制微信聊天框效果:HTML+CSS让网页聊天更生动!
|
4月前
|
API
请问下钉钉有能够获取到群聊天和个人聊天历史记录的api嘛?
DingTalk API 文档中的“消息列表创建”链接似乎已失效:https://developers.dingtalk.com/document/app/message-list-creation. 请注意检查更新或寻找替代资源。
|
10月前
网页一键加群组件
网页一键加群组件
99 1
|
人工智能 算法 机器人
用QQ机器人改变群组管理新方式
随着互联网技术的不断发展,人工智能机器人已经逐渐渗透到我们的日常生活之中。近日,一组来自某工作室编写出一款第十代QQ机器人,凭借其强大的功能和高效的管理,引起了广泛关注。
|
缓存 小程序 JavaScript
附解决方案,小程序用户昵称突然变成了“微信用户”,而且头像也显示不了?
附解决方案,小程序用户昵称突然变成了“微信用户”,而且头像也显示不了?
587 0
|
网络协议 C#
C#实现聊天功能
C#实现聊天功能
230 0
C#实现聊天功能
|
前端开发 JavaScript
前端培训-初级阶段-场景实战(2019-05-16)-聊天头像-微信头像-群组头像
前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 场景实战这块内容每个人的内容都不一样。所以最近的更新基本都是我遇到并解决掉的问题。后期会吧他们的内容贴地址。
197 0
前端培训-初级阶段-场景实战(2019-05-16)-聊天头像-微信头像-群组头像
|
Java 机器人 API
下载telegram群组聊天消息
下载telegram群组聊天消息及统计方案
5303 0
|
开发者 存储
QQ是如何实现好友桌面快捷方式的?
不知道什么时候,QQ推出了好友桌面快捷方式,方便用户和最常保持联系的好友一键联系。
455 0