页面上多个 APlayer 实例的互斥控制
为什么需要互斥
一个页面上可能同时存在多个 APlayer:比如一个吸底播放器 + 文章内的几个迷你播放器。默认情况下,APlayer 的 mutex 参数设为 true,这意味着同一时间只允许一个播放器在播放——当你开始播放第二个时,第一个会自动暂停。
这是用户体验层面的考虑:谁也不希望两个音乐同时响起来。
mutex 参数
| 值 | 效果 |
|---|---|
true(默认) | 互斥。一个播放时,其他自动暂停 |
false | 不互斥。所有播放器可以同时播放 |
// 实例一:吸底播放器
const ap1 = new APlayer({
container: document.getElementById('fixed-player'),
fixed: true,
mutex: true, // 参与互斥
audio: [...]
});
// 实例二:文章内嵌播放器
const ap2 = new APlayer({
container: document.getElementById('inline-player'),
mutex: true, // 也参与互斥
audio: [...]
});
// 实例三:一个不参与互斥的独立播放器
const ap3 = new APlayer({
container: document.getElementById('background-player'),
mutex: false, // 不参与互斥——永远可以单独播放
audio: [...]
});
互斥的工作原理
当 ap1 开始播放时,APlayer 内部会遍历页面上所有设置了 mutex: true 的实例,调用它们的 pause() 方法。mutex: false 的实例不会被影响。
具体来说,ap1.play() 执行时会:
- 播放自己
- 找到
ap2(mutex: true),调用ap2.pause() - 跳过
ap3(mutex: false),不动它
典型场景:全站吸底 + 文章内嵌
// 全站吸底播放器(在页面模板中初始化)
const globalPlayer = new APlayer({
container: document.getElementById('global-player'),
fixed: true,
mutex: true,
audio: globalPlaylist
});
// 文章内嵌播放器(动态创建)
function createArticlePlayer(containerId, audioData) {
const player = new APlayer({
container: document.getElementById(containerId),
mutex: true, // 与全站播放器互斥
audio: audioData
});
return player;
}
// 当用户点击文章内播放器时,全站吸底自动暂停
// 当用户点击全站吸底时,文章内播放器自动暂停
如何让特定播放器不互斥
如果你想某个播放器"永远在后台播放"(比如背景音乐),把它的 mutex 设为 false:
// 背景音乐播放器
const bgm = new APlayer({
container: document.getElementById('bgm'),
mutex: false, // 不和任何播放器互斥
autoplay: false, // 但浏览器仍然会阻止自动播放
audio: [{
name: '背景音乐',
artist: '环境音',
url: 'bgm.mp3'
}]
});
注意:mutex: false 不会帮你绕过浏览器的自动播放限制。背景音乐仍然需要用户先交互才能开始播放。
手动管理多实例
你也可以自己不依赖 mutex,通过事件来手动控制:
const players = [ap1, ap2, ap3];
let currentPlaying = null;
players.forEach(function(ap) {
ap.on('play', function() {
if (currentPlaying && currentPlaying !== ap) {
currentPlaying.pause();
}
currentPlaying = ap;
});
ap.on('pause', function() {
if (currentPlaying === ap) {
currentPlaying = null;
}
});
});
这种方式比 mutex 更灵活——你可以定义自己的优先级或规则。但在绝大多数场景下,mutex: true 就够用了。