
本文详解如何在使用 turn.js 实现电子杂志翻页时,为每页(或每对页)绑定独立音频,并确保翻页过程中旧音频自动暂停、新音频无缝播放,避免声音重叠或残留。
本文详解如何在使用 turn.js 实现电子杂志翻页时,为每页(或每对页)绑定独立音频,并确保翻页过程中旧音频自动暂停、新音频无缝播放,避免声音重叠或残留。
在基于 turn.js 构建的交互式电子杂志中,常需为特定页面(如歌词页、朗读页或配乐页)关联背景音效或语音内容。但若仅在 turned 事件中简单创建并播放 Audio 对象,极易引发多个音频实例并发播放、无法中断前序音频等问题——尤其当用户快速连续翻页时,会出现声音堆叠、内存泄漏甚至浏览器自动静音等异常行为。
核心解决方案在于分离“翻页中”与“翻页完成”两个生命周期阶段,并统一管理音频实例:
- ✅ 在 turning 事件中提前暂停当前正在播放的音频(而非等待翻页结束),确保过渡过程无残留声音;
- ✅ 在 turned 事件中加载并播放目标页对应的新音频,此时页面已稳定呈现,用户体验更自然;
- ✅ 使用单一 audio 变量引用最新音频对象,避免全局污染和引用丢失。
以下是经过生产验证的完整实现逻辑(关键部分已加注释):
function loadApp() { $('#canvas').fadeIn(1000); const flipbook = $('.magazine'); let audio = null; // 声明为块级作用域变量,确保闭包内唯一引用 if (flipbook.width() === 0 || flipbook.height() === 0) { setTimeout(loadApp, 10); return; } flipbook.turn({ width: 922, height: 600, duration: 1000, gradients: true, autoCenter: true, elevation: 50, pages: 12, when: { // 【关键】翻页动画开始时立即暂停当前音频 turning: function(event, page, view) { if (audio && !audio.paused) { audio.pause(); // 调用 pause() 而非 stop()(Audio API 无 stop 方法) audio.currentTime = 0; // 重置播放位置,便于下次复用 } // 同步更新 URL 和导航状态 Hash.go('page/' + page).update(); disableControls(page); }, // 【关键】翻页完成后再加载并播放目标页音频 turned: function(event, page, view) { disableControls(page); $(this).turn('center'); $('#slider').slider('value', getViewNumber($(this), page)); if (page === 1) { $(this).turn('peel', 'br'); } // 动态加载对应页音频(建议按需预加载以提升响应速度) const audioPath = `paudio/${page}.mp3`; audio = new Audio(audioPath); // 添加错误处理,防止因文件缺失导致脚本中断 audio.onerror = function() { console.warn(`Failed to load audio for page ${page}:`, audioPath); }; audio.play().catch(err => { console.warn("Audio play prevented by browser policy (e.g., autoplay blocked):", err); // 可在此处触发用户手势唤醒提示(如点击按钮解禁) }); }, missing: function(event, pages) { for (let i = 0; i < pages.length; i++) { addPage(pages[i], $(this)); } } } }); }
⚠️ 重要注意事项:
- Audio.prototype.stop() 并非标准 Web API 方法,应统一使用 pause() + currentTime = 0 组合替代;
- 浏览器普遍限制自动播放(autoplay),尤其含音频的页面首次加载时。若遇 play() failed because the user didn’t interact with the document first 错误,请确保首次音频播放由用户显式操作(如点击“开始阅读”按钮)触发,后续翻页可正常调用 play();
- 为提升性能,建议对高频访问的音频资源进行预加载(如使用 ),避免翻页卡顿;
- 若需支持跨页连续播放(如整首歌曲 spanning 多页),应扩展逻辑:通过 page 计算所属音频 ID,而非直接使用页码,避免文件命名耦合。
综上,通过合理利用 turn.js 的 turning 与 turned 事件钩子、规范音频生命周期管理,并辅以必要的容错与兼容处理,即可构建出专业级、高响应度的音频增强型翻页体验。