Vue3使用audio实现无播放器播放音频,以及多音频切换bug“The play() request was interrupted by a new load request”处理
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
一、实现原理
Vue 的声明性渲染模型抽象了大部分对 DOM 的直接操作,当我们有需要直接访问底层 DOM 元素的需求,就可以使用特殊的 ref attribute,对DOM 元素实现直接引用,从而实现原生audio播放器的更改和控制。
所需知识点:
- audio标签,以及相关属性操作
- ref attribute的使用
- script setup下函数封装调用等
二、技术实现方案
- HTML部分代码
<div @click="clickAudio(word.voicEnPath)">英标按钮/div>
<div @click="clickAudio2(word.voicUsPath)">美标按钮</div>
<audio ref="audioElement" id="audio" :src="A_src" preload="auto" style="display: block;">
</audio>
<audio ref="audioElement2" id="audio" :src="A_src" preload="auto" style="display: block;">
</audio>
- JS部分逻辑代码
<script setup>
//初始音频地址
const A_src = ref('');
//音频播放
// 音频播放处理
const handleAudioPlay = (audioRef, src) => {
if (audioRef.value) {
audioRef.value.pause(); // 停止当前播放的音频
audioRef.value.currentTime = 0; // 重置播放时间
audioRef.value.src = src; // 设置新的音频源
audioRef.value.load(); // 加载新音频
audioRef.value.onloadedmetadata = () => { // 确保音频元数据加载完毕
audioRef.value.play().catch(error => {
console.error("播放音频时出错:", error);
});
};
}
};
//英标播放器
const audioElement = ref(null);
const clickAudio = (data) => {
console.log('url',data)
handleAudioPlay(audioElement, data);
};
//美标播放器
const audioElement2 = ref(null);
const clickAudio2 = (data) => {
console.log('url',data)
handleAudioPlay(audioElement2, data);
};
</script>
注意事项
- 确保在加载和播放新的音频文件之前,先停止当前播放的音频,并且重置 currentTime。
- 连续播放多个音频文件,可以考虑使用 AudioContext 和相关的Web Audio API来更精细地控制音频的播放,或者使用多个 元素来分别控制不同的音频文件。
- 监听音频的 ended 事件,在音频播放完毕后自动加载并播放下一个音频,从而避免冲突。
如觉的写的不错,欢迎评论讨论,本文为原创,如需转载请标明出处;
GitHub 加速计划 / vu / vue
82
16
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:4 个月前 )
9e887079
[skip ci] 2 个月前
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 6 个月前
更多推荐
已为社区贡献2条内容
所有评论(0)