摘要:但是,新版的浏览器禁止了自动播放音频的功能,见鬼了。当然,这不是特例,像全屏操作,浏览器也是禁止脚本操作的。具体实现静音自动播放循环播放如果是轮询,这个时间必须大于音频的长度。
前言
也许很多前端遇到过这个需求:消息提醒。
一般来说,可以简单的实现绝不会用复杂的方式,audio标签提供了这个功能。
但是,新版的chrome浏览器禁止了js自动播放音频的功能,见鬼了。
这是最简单的音频播放脚本,但是在chrome下,抛出异常:Uncaught (in promise) DOMException,原因是这种操作必须由用户发起。当然,这不是特例,像F11全屏操作,浏览器也是禁止脚本操作的。
但是我们有这个需求,怎么破?
能否不操作play呢?
chrome不仅禁止了脚本自动调用play,还禁止了audio的autoplay属性。
但是,如果音频是静音状态,autoplay属性还是可以生效的。意思是,你可以播放,但是不能干扰用户的视听。
这就给我们提供了一个hack的方法:
默认开启音频的静音播放,而且是循环播放,当我们需要提醒用户的时候,把声音打开,播放时间设置为0秒,播放完毕,关掉声音,继续循环。
是的,音频一直在播放,但是用户听不见。只有我们想让用户听见的时候才能听见,客观上也能实现需求。
结语
- /*
- * muted 静音
- * autoplay 自动播放
- * loop 循环播放
- */
- var audio = document.getElementById("myaudio");
- var t1 = 3e3;//如果是轮询,这个时间必须大于音频的长度。如果是webscoket,应该设置一个状态play,避免重复播放,如下:
- var t2 = 2500;//音频的长度,确保能够完整的播放给用户
- var play = false;
- function run(){
- if(play){
- return false;
- }
- audio.currentTime = 0;//设置播放的音频的起始时间
- audio.volume = 0.5;//设置音频的声音大小
- audio.muted = false;//关闭静音状态
- play = true;
- setTimeout(function(){
- play = false;
- audio.muted = true;//播放完毕,开启静音状态
- },t2);
- }
- setInterval(function(){
- run();//假装在轮询服务器,或者从websocket拉取数据
- },t1);
这个方法经过在chrome上的实测,可以使用。
但是其他浏览器未做测试,据说有的浏览器,似乎是IE不支持muted属性,限于操作系统,没做测试,如果在IE运行有问题,可以给我提个醒。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/102228.html
摘要:一什么是浏览器兼容问题所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。条件注释最初于微软的浏览器中出现,并且直至均支持。 一、什么是浏览器兼容问题 所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都...
摘要:基本用法属性目前只支持你可以看出他们在里表现的差异关于标签支持的音频类型,可以参考常用属性音频流文件就绪后是否自动播放无需预加载只需要加载元数据,例如音频时长,文件大小等。 我觉得DOM就好像是元素周期表里的元素,JS就好像是实验器材,通过各种化学反应,产生各种魔术。 showImg(https://segmentfault.com/img/bVO9vK?w=1440&h=814); ...
阅读 1735·2021-10-12 10:11
阅读 3892·2021-09-03 10:35
阅读 1535·2019-08-30 15:55
阅读 2226·2019-08-30 15:54
阅读 1060·2019-08-30 13:07
阅读 1129·2019-08-30 11:09
阅读 683·2019-08-29 13:21
阅读 2728·2019-08-29 11:32