有时候自我感觉良好,人啊就开始膨胀,细细想来,自己还是那么苍白。---- 致傻傻的我

大家都知道,平时上班总是拿着手机看看微信,看看新闻,这个不太好,这不是重点,重点是我们公司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,他会在桌面右下角弹出一个框,显示必要的信息,图片,标题,消息正文,关闭按钮,设置按钮等

可以参考如下文章:

Notifications API Standard

Notification - Web APIs | MDN

简单了解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聊天之---序章的更多相关文章

  1. Asp.Net MVC4 + Oracle + EasyUI 学习 序章

    Asp.Net MVC4 + Oracle + EasyUI  序章 -- 新建微软实例 本文链接:http://www.cnblogs.com/likeli/p/4233387.html 1.  简 ...

  2. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换

    前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...

  3. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言

    前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研 ...

  4. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。

    前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.L ...

  5. Django项目--web聊天室

    需求 做一个web聊天室,主要练习前端ajax与后台的交互: 一对一聊天和群组聊天 添加用户为好友 搜索并添加群组 管理员可以审批用户加群请求,群管理员可以有多个,群管理员可以删除,添加禁言群友 与聊 ...

  6. Ⅰ.Spring的点点滴滴--序章

    spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 .net篇(环境为vs2012+Spring.Core.dll) 新建一个控制台 using Spring.Context; ...

  7. C蛮的全栈之路-序章 技术栈选择与全栈工程师

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 博主背景 985院校毕业,至今十年C++开发工作经验, ...

  8. web即时通讯2--基于Spring websocket达到web聊天室

    如本文所用,Spring4和websocket要构建web聊天室,根据框架SpringMVC+Spring+Hibernate的Maven项目,后台使用spring websocket进行消息转发和聊 ...

  9. Netty5序章之BIO NIO AIO演变

    Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...

随机推荐

  1. WebStorm10 控制台中文乱码解决方案

    工作时发现无论是使用ctrl+F搜索还是查看提交的注释中文都是口,看的本小白十分蛋疼菊紧,所以抽时间找了方法去搞定它. 首先点击左上角的File,选择Setting 然后选择Appearance &a ...

  2. keeplived日志位置指定

    作为一个运维DBA,除了关心数据库的关键指数.还得往架构和底层基础知识多靠拢. 2010年刚工作的时候,那会Cacti监控比較流行吧.可恶的是SNMP会把默认日志写到系统日志文件中面,导致排错时非常受 ...

  3. uva11059(最大乘积)

    Problem D - Maximum Product Time Limit: 1 second Given a sequence of integers S = {S1, S2, ..., Sn}, ...

  4. poj 2570 Fiber Network(floyd)

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...

  5. Android setContentView方法解析(一)

    在Activity的生命周期onCreate中.我们一般都习惯性的调用setContentView(int layoutResID)方法,把布局文件载入到页面上来.以下我们就来通过源代码一步步的分析怎 ...

  6. 【分享】iTOP4412开发板-Bluetooth移植文档

    [分享]iTOP4412开发板-Bluetooth移植文档 最近须要把Bluetooth移植到iTOP-4412 开发平台.查阅了相关资料,经过一段时间的研究.调试,最终成功的将蓝牙功能移植到了开发板 ...

  7. Hibernate(或其它ORM)里的inverse用法详解,内容摘自Java web轻量级开发面试教程

    本文来是从 java web轻量级开发面试教程从摘录的. Inverse的英文含义是反转,在Hibernate中用来决定是由哪方来维护两个业务实体类之间的关联关系,具体而言,就是由哪方去设置这个被外键 ...

  8. TempData知多少

    网上对TempData的总结为: 保存在session中,Controller每次执行请求时,会从session中一次获取所有tempdata数据,保存在单独的内部数据字典中,而后从session中清 ...

  9. 超详细 值得收藏 linux CentOS 7 配置Apache服务【转发+新增】

    一.Apache简介 Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性(尽管不断有 ...

  10. 使用WebEx录制视频并转换为MP4

    1.下载并安装WebEx http://www.question-defense.com/wp-content/uploads/2010/05/ateditor-version-3.0.zip 2.打 ...