Knockout : 实现复杂的web聊天窗体
公司以前一个同事写的这个聊天的窗体,由于是采用了html拼接的方式,外加处理的时候没有合理的划分职责,导致页面js代码量非常庞大(1500行左右)。现在这哥们离职了,苦的是我们剩下的人,不多说,我先去擦把泪。
公司基本没周都要求给web聊天加各种各样的功能,然后各种不能忍,权衡之后只能选择重构代码,可怜的娃娃啊。。。。
本次完全采用Knockout重构,基础的东西就不多说了,学习Knockout请移步大叔的blog(多谢大叔无私分享) http://www.cnblogs.com/TomXu/archive/2011/11/21/2257154.html
上web聊天界面截图:

view代码:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>后台聊天</title>
<link rel="stylesheet" href="css/jquery.qqFace-min.css" />
<link rel="stylesheet" href="css/index0923.css" />
<style type="text/css">
/* style="display:none;" */
</style>
</head> <body>
<div class="chatDiv" id="chatDiv" style="border:1px solid #ededed;">
<!-- 单聊 -->
<div id="singleChat">
<!-- 聊天联系人列表 -->
<div class="chatLp">
<!--div class="title"><a href="###" class="clearAll">清空</a></div-->
<div class="title">
<a href="###" class="sendAll l">群发</a>
<a href="javascript:void(0);" class="delete r" data-bind="click:function(){viewModel.clearArray();}"></a>
</div>
<ul class="chatList" data-bind="template:{ name: 'demo',foreach:viewModel.viewModelArray}">
<!--<li><i class="ico icoOne"></i><i class="come"></i><span class="txt">八卦台湾</span></li>
<li class="select"><i class="ico icoOne"></i><span class="txt">八卦台湾</span></li>
<li><img class="ico" src="data:images/img.png"/><span class="txt">八卦台湾</span></li>--> </ul>
</div>
<div class="chatRp">
<div class="chatName" data-bind="template:{ name: 'title',foreach:viewModel.selectViewModel}"> </div>
<!-- 对话内容 -->
<div class="content">
<div id="chatMain" class="chatMain" style="overflow-y: scroll;" tabindex="5001" data-bind="template:{ name: 'content',foreach:viewModel.selectModel}"> </div>
<div class="speakInp">
<span class="spaeakBtn biaoq"></span>
<span class="spaeakBtn edit"></span>
<textarea class="textarea-txt" style="overflow: hidden;" data-bind="value:textContent"></textarea>
<a class="sub_btn" href="javascript:void(0);" data-bind="click:function(){viewModel.msgPush();}">发送</a>
</div>
</div>
</div>
<div class="clearB"></div>
</div>
</div>
<div>
<button data-bind="click:add">Add</button>
</div>
<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="js/jquery.qqFace-min.js"></script>
<script type="text/javascript" src="js/jquery.nicescroll.min.js"></script>
<script src="js/jquery.tmpl.js"></script>
<script src="js/knockout-2.0.0.debug.js"></script>
<script type="text/x-jquery-tmpl" id="demo"> <li data-bind="click:function() {viewModel.select($data)},css:{select:$data.data()==viewModel.selectModel()},
event: { mouseover:function(){ viewModel.showCloseIco($data,true);}, mouseout: function(){ viewModel.showCloseIco($data,false);} }"> <img class="ico" data-bind="css:{icoOne:$data.data().length>0}" src="${ico}"></img>
<span class="txt">${name}</span>
<i class="icodelete" data-bind="click:function () {viewModel.remove($data)},style:{display:$data.isShow()== true?'inline':'none'}"></i>
</li> </script> <script type="text/x-jquery-tmpl" id="content">
<div class="anotherIetm" data-bind="css:{selfIetm:$data.msgtype }">
<div class="icoP"><img src="${ico}" class="ico"></div>
<div class="contentP">
<span class="name">${name}</span>
<div class="speakCon">
<span class="jiao"></span>
<div class="mainCont">${msg}</div>
<div class="clearB"></div>
</div>
</div>
<div class="clearB"></div>
</div>
</script> <script type="text/x-jquery-tmpl" id="title">
<span class="left">${name}</span>
<span class="right">
<span>您的身份:[${serverId}]</span>
</span>
<div class="clearB"></div>
</script> <script src="ChatModel.js"></script>
<script src="ChatViewModel.js"></script>
</body>
</html>
Model代码:
/// <reference path="js/knockout-2.0.0.debug.js" />
function LeftObject(ico, name, serverid) {
this.ico = ico;
this.name = name;
this.isShow = ko.observable();
this.data = ko.observableArray();
this.serverId = serverid;
} function MsgContent(msgtype, msg, name, ico) {
this.msgtype = msgtype;
this.msg = msg;
this.name = name;
this.ico = ico;
}
ViewModel代码:
/// <reference path="js/knockout-2.0.0.debug.js" />
//======================左边用户列表操作===========================
var num = 0;
var viewModel = {
add: function () {
num = num + 1;
viewModel.viewModelArray.push(new LeftObject("http://www.baidu.com/img/bdlogo.png", "Test" + num,"客服-应用主"));
if (viewModel.selectModel().length == 0) {
viewModel.selectModel(viewModel.viewModelArray()[viewModel.viewModelArray().length - 1].data());
viewModel.selectViewModel(viewModel.viewModelArray()[viewModel.viewModelArray().length - 1]);
}
},
push: function () {
if (viewModel.selectModel()) {
viewModel.selectModel.push({ content: num, isSend: (num % 2 == 1) })
}
},
viewModelArray: ko.observableArray()
};
viewModel.remove = function (e) {
viewModel.viewModelArray.remove(e); if (viewModel.selectModel() == e.data()) {
viewModel.selectModel([]);
}
viewModel.selectModel(viewModel.viewModelArray()[0].data());
viewModel.selectViewModel(viewModel.viewModelArray()[0]);
}
viewModel.select = function (e) {
viewModel.selectModel(e.data());
viewModel.selectViewModel(e);
}
viewModel.selectModel = ko.observableArray();
viewModel.selectViewModel = ko.observable(); viewModel.showCloseIco = function (e,isShow) {
e.isShow(isShow);
//alert(e.isShow());
} viewModel.clearArray = function () {
viewModel.viewModelArray([]);
} //===========================分割线 下面是聊天窗口操作函数=========================================== viewModel.msgAccept = function (data) {
viewModel.selectModel.push(new MsgContent(true, data, "自己", "images/ico.png"));
} viewModel.msgSend = function (data) {
viewModel.selectModel.push(new MsgContent(false, data, "别人", "images/img.png"));
}
viewModel.textContent = ko.observable();
//模拟发送
viewModel.msgPush = function (data) { if (viewModel.viewModelArray().length == 0) {
return;
}
var d = parseInt( Math.random()*10 % 2);
data = viewModel.textContent();
viewModel.textContent('');
if (d == 0) {
viewModel.msgSend(data);
} else {
viewModel.msgAccept(data);
}
} //=====================================================================
ko.applyBindings(viewModel);
Knockout : 实现复杂的web聊天窗体的更多相关文章
- 高仿webqq做的一个webos桌面效果和web聊天工具,桌面效果完好,功能强大
QQ技术交流群:159995692 /-------- 暂时开放的測试 帐号/password:[88888888/1;666666/1] ---------/ 正如大家所知的E ...
- 使用Servlet和JSP实现一个简单的Web聊天室系统
1 问题描述 利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列
ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 http://www.cnblogs.com/panzi/p/5742089.html ASP.NET S ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换
前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...
- web聊天室
开发一个web聊天室 功能需求: 1.用户可以与好友一对一聊天 2.群聊 所需知识 1.Django 2.bootstrap 3.CSS 4.ajax 涉及到的新的知识点 1.如果设计表结构的时候,一 ...
- 利用html 5 websocket做个山寨版web聊天室(手写C#服务器)
在之前的博客中提到过看到html5 的websocket后很感兴趣,终于可以摆脱长轮询(websocket之前的实现方式可以看看Developer Works上的一篇文章,有简单提到,同时也说了web ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言
前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)
大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(二) 之 ChatServer搭建,连接服务器,以及注意事项。
上篇:ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取) 上一篇我们已经完成了初步界面的搭建工作,本篇将介绍IM的核心内容 ...
随机推荐
- org.springframework.beans.factory.BeanDefinitionStoreException
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'd ...
- ASP.NET MVC4 学习系统五(Razor)
Razor ,你好! Razor 是一种把代码和内容进行平滑集成的语法.尽管它引入了一些新的符号和关键字,但是Razor并不是一种新的语法.相反,Razor允许用户使用已知的语言来编写代码 ...
- 【drp 11】使用Junit简单测试接口方法
一.Junit简介 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个. JUn ...
- Leetcode048. Rotate Image
//鬼晓得上下反转,对角翻转之后竟然正好顺时针九十度,数学事体育老师教的class Solution { public: void rotate(vector<vector<int> ...
- Dynamic AX 4.0 用户组权限SecurityKey
UserId _userId = "IT001"; UserGroupId _userGroupId = "ABC_1"; DomainId _domainId ...
- 学习STL-介绍一下STL
从大学时就开始学习C++,到现在近5年的时间了却很少用到STL.现在想想真得是对不起这门语言,也对不起宝贵的五年光阴.我钟爱C++,所以一定要完全搞懂它,理解它.爱一个人的前提是要懂他(她),爱一门语 ...
- C# 发送邮件方法
发送邮件所用的核心知识点 微软封装好的MailMessage类:主要处理发送邮件的内容(如:收发人地址.标题.主体.图片等等) 微软封装好的SmtpClient类:主要处理用smtp方式发送此邮件的配 ...
- webGL 学习教程
====教程=================== webGL中文网:http://www.hewebgl.com/webGL API:https://developer.mozilla.org/en ...
- pig中变量
pig中的变量都是找到$变量然后替换,有点像宏,完全就是替换,看如下例子 %default m 'you';b = load 'a' as (a:chararray);c = foreach b ge ...
- WeChat 6.3 wipe deleted chat messages as well as LINE 5.3 and above
Let me show you the WeChat version first. It is 6.3. What will happen to WeChat deleted chat message ...