使用addEventListener监听audio的ended事件,会重复执行?
<template>
<div>
<audio :src="nowMusicUrl" controls="controls" ref="musicClick"></audio>
当前播放的曲目是{{nowMusicName}}
<input type="button" value="试试播放嘿" @click="playMusic">
</div>
</template>
<script type="text/ecmascript-6">
export default{
data(){
return {
nowMusicUrl:'',
nowMusicName:'',
startIndex : 0
}
},
props:{
musicList:{
type: Array,
default() {
return [];
}
}
},
created() {
this.nowMusicUrl = this.musicList[this.startIndex].location;
this.nowMusicName = this.musicList[this.startIndex].musicname;
},
mounted:function(){
console.log('dom渲染完毕')
this.playMusic(this)
},
methods: {
playMusic:function(that){
console.log(that.musicList.length,that.startIndex);
if (that.startIndex === that.musicList.length ) {
that.startIndex = 0;
}
that.nowMusicUrl = that.musicList[that.startIndex].location;
that.nowMusicName = that.musicList[that.startIndex].musicname;
let musicPl = this.$refs.musicClick;
setTimeout(function(){
musicPl.play();
},1000);
musicPl.addEventListener('ended',function(){
console.log('音乐播放完毕');
that.startIndex = that.startIndex+1;
that.playMusic(that);
},false)
}
}
}
</script>
第一次监听音乐结束后 打印1次音乐播放完毕 ,第二次2次,第三次4次, 第4次8次。 如何解决,谢谢大佬们了~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
监听时间不要在 PlayMusic 方法里面执行, 应该在初始化 Audio 对象时绑定一次即可.
如果非要在 PlayMusic 方法里面绑定的话, 在回调函数执行时, 执行
audio.removeEventListener()
把自己回调函数移除掉.因为
addEventListener
绑定多个handler是不会覆盖的,事件绑定的东西应该放在生命周期中去做。