需求:正在做的项目是一个SPA音乐播放器,用到了H5新加入的audio标签,同时像主流播放器一样显示当前播放歌曲的秒数和总时间;

思路:查阅API文档得知需要用到audio.currentTime和audio.duration分别表示当前播放时间和音频总时间,但如何用数据驱动的思想来使用成了第一个问题。

左思右想好像避免不了DOM操作,于是先用了dom.querySelector选中audio音频元素,再调用上面说到的2个方法来显示播放时间。

但实际操作起来并无效果,浏览器报错提示不能操作undefined对象的currentTime和duration方法;

怀疑是dom操作语句有问题,遂考虑使用ref引用来操作audio:

<audio ref='player' src='...' preload></audio>

<p>{{ cTime }}</p>

<p>{{ dTime }}</p>

data(){

return{

cTime: null,

dTime: null

}

},

mounted(){

this.cTime = this.$refs.player.currentTime,

this.dTime = this.$refs.player.duration

}

如此下来倒是不报错了,但是不管audio播放到什么时候,currentTime一直是0;而音频总时间则很诡异的为NaN。

经过一番查找,第一个问题是因为挂载mounted钩子只执行了一次当前时间也就是初始时间0,并没有进行监听,所以无法一直更新;

而第二个问题是浏览器的bug,某些主流浏览器需要监听canplay属性才能得到duration。

于是增加两个监听method:

methods: {addEventListeners: function () {const self = this;self.$refs.player.addEventListener('timeupdate', self._currentTime),self.$refs.player.addEventListener('canplay', self._durationTime)},removeEventListeners: function () {const self = this;self.$refs.player.removeEventListener('timeupdate', self._currentTime)self.$refs.player.removeEventListener('canplay', self._durationTime)},_currentTime: function () {const self = this;self.timeNow = parseInt(self.$refs.player.currentTime)},_durationTime: function () {const self = this;self.timeDuration = parseInt(self.$refs.player.duration)}},mounted() {this.addEventListeners()},beforeDestroyed() {this.removeEventListeners()}

如此,便能正确监听到动态当前时间和音频总时间了。

后期只要对获取到的时间做个小处理,变成时:分:秒的形式就可以,代码很简单就不贴出来了。

至此,这个audio的坑基本解决,值得一提的是中间还尝试了Vue.nextTick方法,但在这个demo中却并不适用,

其原理是等dom更新后执行返回函数,但我们这个audio在播放中currentTime的改变并不会引发dom的更新,

所以同样不能监听到。

Vue2.0之H5元素Audio属性currentTime、duration应用相关推荐

  1. vue2.0 结合HTML5原生Audio标签在移动端的使用实现方式,应用场景为钉钉微应用

    在做vue2.0钉钉微应用项目,有需要播放音频的是需求,用阿里云sdk播放器不购买相关服务,音频有些播放不了.于是我就直接用HTML5原生的Audio标签自己写音频播放器.(业务需求:记录上次播放位置 ...

  2. Vue2.0+vuex+H5实现音乐播放及歌曲切换功能的方法及原理解释

    最近在用mint-ui重写一个vue.js音乐App项目,做到播放器模块,感觉挺有意思,记录一下播放器歌曲播放及歌曲切换功能实现方法及原理. 先上一张运行效果图(歌词尚未抓取.播放进度条及时间尚未开发 ...

  3. VUE2.0搭建H5项目

    1.搭建VUE2.0项目 vue create '项目名' 2.安装flexible插件(适配移动端插件) npm install lib-flexible -S 2.1 在main.js中引入fle ...

  4. Vue2.0 $set()处理数据更新但视图不更新的问题(给对象添加属性必须用this.$set(this.data,”key”,value’))

    vue2.0 给data对象新增属性,并触发视图更新 如下代码,给 student对象新增 age 属性 data () {return {student: {name: '',sex: ''}} } ...

  5. Vue2.0 $set()的正确使用方式

    vue2.0 给data对象新增属性,并触发视图更新 如下代码,给 student对象新增 age 属性 data () {return {student: {name: '',sex: ''}} } ...

  6. 关于H5、CSS3新增的一些元素及属性

    H5简介 HTML5是HTML最新的修订版本,具有新的元素,属性和行为. HTML5规范于2014年10月29日由万维网联盟正式宣布. 随着移动化的进程,HTML5终将成为主流. H5的新变化 H5文 ...

  7. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性

    回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...

  8. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性+watch...

    回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...

  9. vue2.0+stylus实现星级评定组件,computed计算属性实现全星半星,动态改变星级,多种星星规格

    vue2.0+stylus实现星级评定组件,computed计算属性实现全星半星,多种星星规格 使用方法如下:(size为星星的大小,score为评分,比如传4.5,则4.5颗星亮:传4.1则四颗星亮 ...

最新文章

  1. mysql 慢查询_mysql如何捕捉慢日志查询
  2. 例5.12 输入一串字符,字符个数不超过100,且以.结束。 (信息学奥赛一本通)...
  3. 腾讯视频如何删除观看记录
  4. 洛谷2774:[网络流24题]方格取数问题——题解
  5. Lenet神经网络实现
  6. eclipse环境NDK问题汇总
  7. LINUX上传下载小工具lrzsz
  8. Java快逸报表展现demo,快逸报表展示图片—来自数据库中的图片
  9. 网络安全实验室 脚本关 解析
  10. xp下电脑关机超级慢
  11. python fork()创建新的进程,daemon进程
  12. rar,zip文件加密判断
  13. cloudera manager 安装界面指定主机无法选中解决方案
  14. 百度地图API底色主题更换
  15. 8. 关于打分函数F1分数 TPR PPV等
  16. 全国青少年软件编程等级考试内容,知识点思维导图(Scratch编程一级)
  17. Notice: Use of undefined constant MCRYPT_RIJNDAEL_128 - assumed ‘MCRYPT_RIJNDAEL_128‘ in
  18. gitlab修改密码和中文页面
  19. unity制作全息视频/全息投影
  20. u盘误删的文件怎么找回

热门文章

  1. 物理学的困惑: 科学的道德规范和伦理观
  2. linux进程与服务管理,linux基础之进程管理与服务
  3. 美国雅虎大幅改善移动应用开发环境“Blueprint”
  4. 【老李的模拟赛】【#6】【2014-08-12】
  5. tar命令解压.zip文件出错:gzip: stdin has more than one entry--rest ignored
  6. php文字外链,锚文本外链如何制作?
  7. 交通行业舆情工作管理怎么做?
  8. 空间前方交会(利用相机外方位元素和像点坐标进行解算)
  9. 使用apache服务部署静态网站--初篇
  10. 悦然建站分享:破解版的宝塔面板可以使用吗?