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

大家都知道,平时上班总是拿着手机看看微信,看看新闻,这个不太好,这不是重点,重点是我们公司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. php的过滤器功能

    1.简介 PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入. 1.1 外部数据: 来自表单的输入数据 Cookies Web services data 服务器变量 数据库查询结果 1 ...

  2. 在Intellij里使用Erlang依赖库

    这里以protobuffs为例,记录一下环境的配置,发现这种东西中文的资料真的不多,无论是分享还是记录都是很好的 1.创建一个文件夹名use_proto, 配置rebar.config文件如下: {d ...

  3. Office Add-in 设计规范与最佳实践

    作者:陈希章 发表于 2017年8月6日 引子 离上一篇Office Add-in的文章已经过去了一段时间,期间有去年Office 365 Asia Devday & Hackathon的二等 ...

  4. 关于UTF8文件带BOM头可能会引起的错误解析

    今天在做一个文件上传的项目中碰到了一个十分奇怪的问题,在解析上传上来的csv文件时,总是在解析第一行的第一个标题字段时出错,就是第一个那个字段总是和对应的model字段对应不上,这个坑是真的很深,找了 ...

  5. 项目实战12.2—企业级监控工具应用实战-zabbix操作进阶

    无监控,不运维.好了,废话不多说,下面都是干货. 流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html 一.U ...

  6. springboot+CXF开发webservice对外提供接口(转)

    文章来源:http://www.leftso.com/blog/144.html 1.项目要对外提供接口,用webservcie的方式实现 2.添加的jar包 maven: <dependenc ...

  7. WebApi的多版本管理

    1.多版本管理概念 什么是API的多版本问题?Android等App存在着多版本客户端共存的问题:由于早期没有内置升级机制,用户不会升级,拒绝升级等原因,造成了许多软件的旧版本App也在运行.开发新版 ...

  8. C#备份一个文件到指定的文件夹里面

    一开始我的想法是这样的: //在控制台里面操作 static void Main(string[] args) { //backup( @"D:\gg\config.xml", @ ...

  9. iOS wkwebview懒加载中遇到的问题

    这是我遇到的问题,也许是个例,就算狗血了点吧 需求: 当前界面(mainVC)响应点击事件,传值给webviewController(webVC)其中包含网址,此时如果在webVC中对wkwebvie ...

  10. 447. Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...