web聊天系统的消息通知问题

位流露台
• 阅读 3442

web消息提示无非三种方式:声音提示,桌面弹窗和title闪烁提醒。下面做一一介绍。

声音提示

注意声音提示前提示已经加载了声音文件,有文章写的很多是临时create一个audio对象,然后audio.src,这样做是非常不好的,因为你每次调用声音的时候都会去后台请求一下这个声音文件。所以先加载出来是最好的方法。

<audio id="chat-audio" src="audio/system.wav" display="none"></audio>

function playAudio() {
    document.getElementById('chat-audio').play(); 
    //pause()方法也可以暂停,具体可查html5的audio标签
}
//调用方式
playAudio();

桌面弹窗

function palyDeskNotice(theTitle, options) {
    if (Notification.permission !== "granted") {
        //先判断一下用户是否已经开启了桌面提示的权限,如果没有则提醒用户开启
        window.Notification.requestPermission(function(permission) {
            if (permission === "granted") showNotice(theTitle, options);
        });
    } else {
        showNotice(theTitle, options);
    }
}
 
function showNotice(theTitle, options) {
        //这个就是桌面弹窗
    var desknotice = new Notification(theTitle, options);
    desknotice.onclick = function() {
        //当用户点击弹窗的时候,要定位到聊天窗口
        window.focus();
        desknotice.close();
    };
    //页面退出时关闭提醒
    window.onbeforeunload = function() {
        desknotice.close();
    }
    //弹窗3秒后自动消失
    setTimeout(desknotice.close.bind(desknotice), 3000);
}
//调用方式
palyDeskNotice('来自xxx', {
    body: '内容',
    icon: "images/xxx.jpg"
});

title闪烁提醒的原理

var NewMsgNoticeflag = false,//闪烁标识
    newMsgNotinceTimer = null;
 
function newMsgCount() {
    if (NewMsgNoticeflag) {
        NewMsgNoticeflag = false;
        document.title = '【☏新消息】您有新的即时消息';
    } else {
        NewMsgNoticeflag = true;
        document.title = '【   】您有新的即时消息';
    }
}
//兼容性
var hiddenProperty = 'hidden' in document 
? 'hidden' : 'webkitHidden' in document 
? 'webkitHidden' : 'mozHidden' in document 
? 'mozHidden' : null;
 
var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange');
var onVisibilityChange = function() {
        if (!document[hiddenProperty]) {
            clearInterval(newMsgNotinceTimer);
            newMsgNotinceTimer = null;
            document.title = 'beta-即时消息系统'; //窗口没有消息的时候默认的title内容
        }
    }
document.addEventListener(visibilityChangeEvent, onVisibilityChange);
//调用方式
if (!newMsgNotinceTimer) newMsgNotinceTimer = setInterval("newMsgCount()", 200);
点赞
收藏
评论区
推荐文章
寻找消失的类名
一、目标前几天有个朋友问了我一个新手问题,frida提示:找不到 p009cn.com.chinatelecom.gateway.lib.C1402a 这个类1:main原因是,jadx反编译的时候,为了反混淆,会把类名做个处理,加上几个数字,这样好让你分辨,不会满眼都是变量a。实际上他已经提示你了,这个类的真实类名是 cn.com.chinateleco
Wesley13 Wesley13
4年前
java工作流引擎 Activiti6.0 websocket 即时聊天发图片文字 好友群组 SSM源码
时通讯:支持好友,群组,发图片、文件,消息声音提醒,离线消息,保留聊天记录工作流模块1.模型管理  :web在线流程设计器、预览
MaxSky MaxSky
4年前
PHP 微信公众号消息加解密
公众号配置根据提示设置即可:【图中信息均为无意义数据,仅供参考。注意服务器地址需可接收GET/POST两种请求】AESKey直接点一下随机生成即可,Token可以生成一个UUID再把UUID进行MD5一次即可。接收关注事件消息示例请求参数校验这一步根据项目情况,可供参考:(Lumen框架)php$valida
徐小夕 徐小夕
5年前
精通React/Vue系列之实现一个全局提示(Message)组件
前言本文是笔者写组件设计的第十一篇文章,今天带大家实现一个同样比较特殊的组件——全局提示(Message)组件。我们看到的组件效果可能是这样的:由于全局提示组件的
wnm wnm
4年前
万能码的码上付全新的体验(安全扫码专业委员会)
万能码的码上付全新的体验(安全扫码专业委员会)大家里的支付宝收款提示音的那个“灵动”的声音吗?每每听到那个声音都会巴适得板,因为那是到账的声音,也许这个是源头,逐渐后面出现了许许多多的提示音,主要还是防止有顾客遗忘转账,也可能是为了防止顾客转账数额不对,因此久而久之要是没有了声音,反而会不习惯了,而码上付也拥有这样的作用。
Easter79 Easter79
4年前
Toast的使用详解
Android中提供一种简单的Toast消息提示框机制,可以在用户点击了某些按钮后,提示用户一些信息,提示的信息不能被用户点击,Toast的提示信息根据用户设置的显示时间后自动消失。Toast的提示信息可以在调试程序的时候方便的显示某些想显示的东西,或者给用户提供友好的界面显示效果。有两种方式去创建并且显示Toast:1.Toast.m
Wesley13 Wesley13
4年前
Java对象数据校验工具类VerifyUtils
背景介绍Excel数据导入是很常见的功能,可很多时候客户导入的数据未必能入库,比如字段超长,类型错误……等。在产品经理提出要做数据校验的时候你难道要一个字段一个字段去校验?而且系统有几十张表都需要类似的功能,更何况客户导入的数据成千上万条数据,如果每次提示某个字段错误肯定是不友好的。要求是提示excel某行某些字段发生了什么错误。网络上找了
Stella981 Stella981
4年前
Android第四十五天
一、ProgressDialog(是一个含有进度条以及消息提示的对话框)     ProgressDialog的使用:           1、创建对象;1.finalProgressDialogdialognewProgressDialog(MainActivity.this);          
Wesley13 Wesley13
4年前
Java Activiti 工作流引擎 流程审批 后台框架源码 springmvc SSM
博文来源:http://www.fhadmin.org/webnewsdetail1.html即时通讯:支持好友,群组,发图片、文件,消息声音提醒,离线消息,保留聊天记录工作流模块
程序员小五 程序员小五
2年前
如何解决 Web 音视频本地回声问题?
回声问题产生的原因,一般是由于本地麦克风采集的声音通过声音外放设备在当前环境中输出,被麦克风重复采集造成。为避免回声,建议在处理本地音视频时,不要播放本地采集的音频,仅做视频展示即可。
程序员小五 程序员小五
2年前
如何自定义本地通知提示音
如果使用了SDK的本地通知,只想自定义本地通知的提示音,可以参考如下:自定义声音文件,命名为“smsreceived”,格式为“caf”(这里是SDK代码根据这个命名来判断设置本地通知提示音的,所以一定要一致)找到工程中添加的sdk的资源文件RongClo