canplaythrough 事件定义和用法

当浏览器预计能够在不停下来进行缓冲的情况下持续播放指定的音频/视频时,会发生 canplaythrough 事件。

当音频/视频处于加载过程中时,会依次发生以下事件:

浏览器支持

所有主流浏览器都支持 canplaythrough 事件。

注释:Internet Explorer 8 或更早的浏览器不支持该事件。

以上是w3cschool的解释,但是在我实验检测中,发现chrome,firefox对此事件是支持的,而移动端对此事件支持需要辅助方法。

我们在做移动端h5的时候,可能都会需要预加载资源,包含图片,音视频文件

var audio = new Audio();
audio.addEventListener("canplaythrough",function(){
console.log("加载完成!");
},false);
audio.addEventListener("error",function(){
console.log("加载失败!");
},false);
audio.src = src;

看这段代码好像每错,在pc端检测也没有错,但是当我们放到h5上面就会出错,因为手机上面音乐是流媒体加载的,就是说在加载的过程中是可以播放的一边加载一边播放,canplaythrough 事件在移动端,只有允许audio/video文件加载播放完之后才会执行。

var audio = new Audio();
//canplaythrough这个事件在手机上流媒体要一边播放才能监听得到,pc端chrome可以完美支持
audio.addEventListener("canplaythrough",function(){
//我们发现播放完之后这里执行了
console.log("加载完成!");
},false);
audio.addEventListener("error",function(){
console.log("加载失败!");
},false);
audio.src = src;
audio.play();

但是这里会导致加载的时候就播放声音,那于是这样干

var audio = new Audio();
//canplaythrough这个事件在手机上流媒体要一边播放才能监听得到,pc端chrome可以完美支持
audio.addEventListener("canplaythrough",function(){
audio.pause();
audio.volume = ;
//我们发现播放完之后这里执行了
console.log("加载完成!");
},false);
audio.addEventListener("error",function(){
console.log("加载失败!");
},false);
audio.src = src;
audio.play();
audio.volume = ;

但是发现,效果不好,会出现停顿等现象。

于是最后想了一种方法,通过xmlHTTP来获取音频文件:

function createXHR(){
try { return new XMLHttpRequest(); } catch (e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
return null;
} var xhr=createXHR();
xhr.onreadystatechange=function(){
if(xhr.readyState == ){
if((xhr.status >= && xhr.status < ) || xhr.status == ){
callNext();
}else{
callNext();
}
}
};
scr = "song.mp3";
//true(异步)或 false(同步)
xhr.open("post",src,false);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send()

但是发现这样做还是不完美,发现音乐还是有延迟的现象;

欢迎大神拍砖,给出解决办法

HTML 5 Audio/Video DOM canplaythrough 事件在移动端遇到的坑的更多相关文章

  1. HTML 5 Audio/Video DOM buffered 属性

    1.实例1获取视频第一段缓冲范围部分,以秒计: myVid=document.getElementById("video1"); alert("Start: " ...

  2. HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48   <audio> 标签属性:src:音乐的URLpreload:预加载au ...

  3. [转载]HTML5 Audio/Video 标签,属性,方法,事件汇总

    <audio> 标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览器自带的控制条 <audio id=& ...

  4. HTML5 Audio/Video 标签,属性,方法,事件汇总 (转)

    HTML5 Audio/Video 标签,属性,方法,事件   <audio> 标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放contro ...

  5. 【转载】HTML5 Audio/Video 标签,属性,方法,事件汇总

    <audio> 标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览器自带的控制条 Html代码  <au ...

  6. [转帖]HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 <audio>标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 co ...

  7. html5 audio/video 的那些坑

    当我最近项目用到audio的时候,我们用到了jPlayer作为三方库. 功能实现了,暂停播放,进度条什么的,都很顺利的搞定了.后来考虑到当网速过慢时需要给播放按钮一个载入动画,然后就一发不可收拾了. ...

  8. video 属性和事件用法大全

    1.video 属性 <!-- video 不支持 IE8及以下版本浏览器,支持三种视频格式:MP4,WebM 和 Ogg --> <video src="test.mp4 ...

  9. HTML5 Audio & Video 属性解析

    一.HTML 音频/视频 方法 play() play() 方法开始播放当前的音频或视频. var myVideo=document.getElementById("video1" ...

随机推荐

  1. 【Machine learning】余弦相似度

  2. mongodb 3.2.x 启动 Warning 错误处理

    [root@restore1 data1]# mongod --dbpath=/data/data1/mongodb_data/ --directoryperdb ** WARNING: You ar ...

  3. ubuntu下安装程序的五种方法

    在ubuntu当中,安装应用程序我所知道的有三种方法,分别是apt-get,dpkg安装deb和make install安装源码包三种.下面针对每一种方法各举例来说明. 一.apt-get方法 使用a ...

  4. linux环境中通过useradd命令,创建用户的时候指定用户的base-dir

    需求说明: 今天一个同事,问了一个这样的问题,在linux环境中,创建用户的时候,默认的是在/home目录下创建一个与用户名相同的家目录, 如何能够将这个/home更换成一个其他的,比如/opt/ap ...

  5. jquery.fileupload插件 ie9下不支持上传

    根据https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support The following browsers support ...

  6. OO模式-Singleton

    讨论一: 既然仅仅有一个类?为什么非要用一个模式来定义?难道就不能用程序猿之间的约定又或者使用伟大的设计模式来完毕? 1)先来说说全局变量的优点,当定义一个全局变量时,不论什么一个函数或者一行代码都能 ...

  7. 8 -- 深入使用Spring -- 3... 资源访问

    8.3 资源访问 Spring 为资源访问提供了一个Resource接口,Spring框架本身大量使用了Resource来访问底层资源. Resource 本身是一个接口,是具体资源访问策略的抽象,也 ...

  8. 扩展方法(DateTableToList)

    public static IList<T> ToList<T>(this DataTable dt) where T : class,new() { var prlist = ...

  9. nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)

    当你执行sudo nginx -s reload时出现nginx: [error] open() "/run/nginx.pid" failed (2: No such file ...

  10. trim思考

    今天发现后台订单商品名称没有的时候出现了HTML代码,然后看了一下源代码(下图是简化版本的) <?php $name = trim('<span style="font-weig ...