我的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简化了网络程序的开发,是很多框架和公司都在使 ...
随机推荐
- python的简介及入门
前言 为何使用Python Python 是一种效率极高的语言.与其他众多的语言相比,实现相同功能,使用Python编写的程序包含的代码更少.Python的语法简单,易上手,使用Python编写的代码 ...
- 高版本号chrome安装flashplayer debuger后无法使用的问题
起因应该是苹果公司指出flash player的安全问题,还有各种原因导致google将在未来取消NPAPI的支持,所以fp们就悲剧了在高版本号chrome(42以上)默认是关闭外部安装的插件使用的, ...
- Android音频: 怎样使用AudioTrack播放一个WAV格式文件?
翻译 By Long Luo 原文链接:Android Audio: Play a WAV file on an AudioTrack 译者注: 1. 因为这是技术文章,所以有些词句使用原文,表达更准 ...
- Spring基础知识之依赖注入
Spring框架的四大原则: 1)使用POJO进行轻量级和最小侵入式的开发. 2)通过依赖注入和基于接口编程实现松耦合. 3)通过AOP和默认习惯进行声明式编程. 4)使用AOP和模板(templat ...
- Asp.net mvc 知多少(一)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- 【开源】接口管理平台eoLinker AMS 开源版3.1.5同步线上版!免费增加大量功能!
概要:eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本, ...
- 《程序员的思维修炼:开发认知潜能的九堂课》【PDF】下载
<程序员的思维修炼:开发认知潜能的九堂课>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196325 内容简介 运用一门程序设计语言 ...
- 解决[babel] note:the code generator has deoptimised the styling...
在使用webpack的babel-loader编译es6的js文件时,出现了如题的提示. 解决方法如下: loaders: [ { test: /\.js$/, loader: 'babel', qu ...
- 【java】System成员输入输出功能out、in、err
package System输入输出; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOu ...
- jQuery 最外面的那层皮
这次学习 jQuery 源码,基于当前最新的版本,3.2.1. IIFE (function() { 'use strict'; // })(); 定义一个匿名函数并立即执行,得益于 javascri ...