我的web聊天之---序章

小编 2026-06-05 阅读:1367 评论:0
有时候自我感觉良好,人啊就开始膨胀,细细想来,自己还是那么苍白。---- 致傻傻的我 大家都知道...

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

 

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

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表