我的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简化了网络程序的开发,是很多框架和公司都在使 ...
随机推荐
- Windows Azure系列-- 配置Azure Power Shell
1.下载Azure Power shell https://azure.microsoft.com/en-us/documentation/articles/powershell-install-co ...
- jQuery遮罩层插件
在网页上常常遇到须要等待非常久的操作,比方导出报表等.为了预防用户点击其它操作或者多次点击同个功能,须要用遮罩层把页面或者操作区盖住.防止用户进行下一步操作.同一时候能够提高界面友好度,让用户知道操作 ...
- SourceTree 基本介绍
Git的服务器端: 最出名的是GitHub,但是不能创建私有仓库,创建私有得需要Money Bitbucket:可以创建私有数据库,但是速度太慢,太消磨激情了 如果既想创建私有又想要激情,那只能自己搭 ...
- 《TCP-IP详解卷2:实现》【PDF】下载
<TCP-IP详解卷2:实现>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介 <TCP/IP详解·卷2 ...
- JavaScript循环实例
几个经典的循环案例: 1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米 var i=0; var h=0.0001; while(true){ i++; h=h*2; ...
- 并行rsync
#!/bin/bash ]; then echo -e "usage : \n\t$0 hostList src_file dst_path" echo -e "exam ...
- awk 字符拼接
i-6gdkkemx 2 2 #cat cpu.txt | awk '{print $1,$2"核"$3"G"}' i-6gdkkemx 2核2G
- spring boot使用profile来区分正式环境配置文件与测试环境配置文件
转载请在页首注明作者与出处 一:前言 经常在开发的时候,项目中的配置文件,在个人开发的时候有一套配置文件,在测试环境有一套配置文件,在正式环境有一套配置文件,这个时候如果配置文件复杂,需要改的东西就特 ...
- JavaSE项目之聊天室
引子: 当前,互联网 体系结构的参考模型主要有两种,一种是OSI参考模型,另一种是TCP/IP参考模型. 一.OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems In ...
- ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录
放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...