我的web聊天之---序章
有时候自我感觉良好,人啊就开始膨胀,细细想来,自己还是那么苍白。---- 致傻傻的我
大家都知道,平时上班总是拿着手机看看微信,看看新闻,这个不太好,这不是重点,重点是我们公司web版本的微信,QQ都上不去,这也不是重点,若我还是单身。现在有媳妇指令的时候,总是接收不到,这个不太好。
于是就想自己写一个聊天的好了,是男人说干就干呗。
功能需求
1. 文本消息
2. 消息提示,因为是web版本,如果不在当前窗前窗口的时候,需要智能提示,如果在,当然不需要
3. 一些内置的动态表情
4. 图片的传送,
图片粘贴,
图片拖拽
5. 文件的拖拽
6. 一对多的 图片和文件传送
7. 支持多人聊天即多窗口聊天
8. 语音 + 视频聊天
实现思路
1. 语言
我数数我会的语言也就是C#,nodejs, java,勉强能读php,
其实一直想用php写点啥来着,我看好php的p(飘逸),但是不是现在,
java 不喜欢笨重的大叔,一直都很讨厌,最不喜欢的语言,没有之一,
C#,原来的老本行,虽然用了那么久,一直基于产品的二次开发,想想自己真是个弱鸡,原来用 C#作为后台写了个pm25实时引用和在线的五子棋,可行,但是不想用了,
2016年3月转了专门的js,至少我喜欢,就是你了- nodejs
2. socket.io
其实选择了nodejs,你也没得选了
3. 消息提示
Notification
4. 视频聊天
webrtc(adapter.js)
基本上就这些了,实现的程度,也是按照需求的顺序
虽说是连续剧,这一集,必须有点料,那就是基本的文本聊天。
nodejs + socket.io + html5 web socket 这种聊天,太多了。我就不解释了,也不多说了。
消息提示的逻辑依然是 如果不在当前窗口的时候,需要智能提示,如果在,当然不需要
那么问题的重点就是,
1. 如何判断当前窗框是不是不激活,反过来是不是被隐藏了,查看代码方法 getWindowHiddenKey,获得判断当前穿孔是不是hidden的属性名,然后document[propertyName]就可以得知是不是隐藏了
2. 如果把消息通知给用户,这里就用到了window.Notification,他会在桌面右下角弹出一个框,显示必要的信息,图片,标题,消息正文,关闭按钮,设置按钮等
可以参考如下文章:
简单了解HTML5中的Web Notification桌面通知 « 张鑫旭-鑫空间-鑫生活
3. 如何让消息提示不消失,一直提示
为什么这么做了,女人嘛,有时候分神,一个不小心关闭了,咋办了。
本来是想通过设置完成的,结果查看了文档,没有找到合适的,等待高人指点哈。
好像有个windows的设置,但是觉得这个有点麻烦用户了。
我的思路是在关闭的时候再次打开提示框,以得以延续。
4. 如何回到页面聊天
这个问题,开始我也一直再想,官方文档上有答案,notification的click里面调用window.focus(),我差点怀疑自己是不是懂html和js.
好吧,废话不多了,上代码。
define(function (require, exports, module) { class Notify { constructor(alwaysShow = false) {
this.supported = window.Notification != null
this.options = {
renotify: true,
noscreen: false,
tag: 'jchat',
icon: '/img/notify_title.jpg'
}
this.hiddenKey = Notify.getWindowHiddenKey()
this.alwaysShow = alwaysShow || false
this.manualClosed = false
} popNotify(title, options) {
let opt = Object.assign({}, this.options, options)
if (Notification.permission == 'granted') {
var notification = new Notification(title, opt)
this.initalizeNotification(notification, title, opt)
}
} initalizeNotification(notification, title, options) {
notification.onclick = () => {
//返回消息窗口
//关闭消息框
this.manualClosed = true
notification.close()
window.focus()
} notification.onclose = () => {
if (document[this.hiddenKey] && this.alwaysShow && !this.manualClosed) {
this.manualClosed = false
notification = new Notification(title, options)
this.initalizeNotification(notification, title, options)
}else{
this.manualClosed = false
}
}
} pop(title, options) {
//若是支持并且隐藏,弹出消息
if (this.supported && document[this.hiddenKey]) {
if (Notification.permission == 'granted') {
this.popNotify(title, options)
} else if (Notification.permission != 'denied') {
Notification.requestPermission(() => {
this.popNotify(title, options)
})
}
}
} static getWindowHiddenKey() {
if (typeof document.hidden !== 'undefined') {
this.hiddenKey = 'hidden'
} else if (typeof document.mozHidden !== 'undefined') {
this.hiddenKey = 'mozHidden'
} else if (typeof document.msHidden !== 'undefined') {
this.hiddenKey = 'msHidden'
} else if (typeof document.webkitHidden !== 'undefined') {
this.hiddenKey = 'webkitHidden'
}
return this.hiddenKey
}
} module.exports = Notify
})
演示地址:https://babydairy2017.cloudapp.net:8081/chat.html
我的web聊天之---序章的更多相关文章
- Asp.Net MVC4 + Oracle + EasyUI 学习 序章
Asp.Net MVC4 + Oracle + EasyUI 序章 -- 新建微软实例 本文链接:http://www.cnblogs.com/likeli/p/4233387.html 1. 简 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换
前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言
前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。
前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.L ...
- Django项目--web聊天室
需求 做一个web聊天室,主要练习前端ajax与后台的交互: 一对一聊天和群组聊天 添加用户为好友 搜索并添加群组 管理员可以审批用户加群请求,群管理员可以有多个,群管理员可以删除,添加禁言群友 与聊 ...
- Ⅰ.Spring的点点滴滴--序章
spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 .net篇(环境为vs2012+Spring.Core.dll) 新建一个控制台 using Spring.Context; ...
- C蛮的全栈之路-序章 技术栈选择与全栈工程师
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 博主背景 985院校毕业,至今十年C++开发工作经验, ...
- web即时通讯2--基于Spring websocket达到web聊天室
如本文所用,Spring4和websocket要构建web聊天室,根据框架SpringMVC+Spring+Hibernate的Maven项目,后台使用spring websocket进行消息转发和聊 ...
- Netty5序章之BIO NIO AIO演变
Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...
随机推荐
- HVR又一次load的时候须要将schedule suspend掉
今天在进行HVR的又一次load的时候.报错了: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fi ...
- http get(swift and oc)
SynchonousRequest: let urlPath: String = "http://www.weather.com.cn/data/sk/101010100.html" ...
- Error: Failed to launch instance "win7": Please try again later [Error: No valid host was found. ].
感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- hdu5303Delicious Apples
题意大概就是有n框苹果放在长度为L的环上,每框有ai个苹果.你有一个容量为k的框.要你从0点处出发,随意走.框满了就回到0点把苹果放在那里.继续走直到把苹果都拿完为止.问你最少要走多少路程. 首先贪心 ...
- [源码]解析 SynchronousQueue 上界,下界.. 数据保存和数据传递. 堵塞队列. 有无频繁await?
简析SynchronousQueue.LinkedBlockingQueue(两个locker,更快),ArrayBlockingQueue(一个locker,读写都竞争) 三者都是bloc ...
- 你为什么还坚持.NET
C#换什么比较合适? 从TIOBE来看,Java.C++.C.Python都好,对了,还不能忘了JS. Sql Server换什么比较合适? MySql挺好,Oracle也不错,也还有不少选择. 都挺 ...
- [笔记]使用Keepalived实现Nginx主从热备
HA(High Available), 高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点. 1.1. 高可靠软件keepalived keepaliv ...
- python self
Python要self的理由 Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数(self),但在调用这个方法的时候不必为这个参数赋值(显胜于隐的引发). Pyt ...
- JDBC中rs.beforeFirst()
写在前面: 最近的项目比较老,用到了jdbc查询数据,展示数据.有时候一个查询语句的ResultSet需要用到好几次,即需要遍历好几次同一个查询结果集,那要怎么办呢? 使用如下方式即可解决 其实这里理 ...
- android中Log类的封装
1.为了方便的使用Log打印日志,以及后续方便撤销日志打印,所以对Log类进行封装是一件好事. package market.phone; import android.util.Log; /** * ...