使用addEventListener监听audio的ended事件,会重复执行?

发布于 2022-09-05 10:06:44 字数 1860 浏览 18 评论 0

<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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你曾走过我的故事 2022-09-12 10:06:44

监听时间不要在 PlayMusic 方法里面执行, 应该在初始化 Audio 对象时绑定一次即可.

如果非要在 PlayMusic 方法里面绑定的话, 在回调函数执行时, 执行 audio.removeEventListener() 把自己回调函数移除掉.

御守 2022-09-12 10:06:44

因为addEventListener绑定多个handler是不会覆盖的,事件绑定的东西应该放在生命周期中去做。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文