You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Howler JS启用HTML5模式后页面无法刷新及音频无法续播求助

Howler.js HTML5模式下页面跳转卡顿与续播问题解决方案

一、解决页面跳转/刷新卡顿问题

原beforeunload事件中调用stop()无效,是因为HTML5模式下Howler的stop()仅重置播放进度,并未彻底销毁音频资源,浏览器卸载页面时会等待资源释放,进而导致卡顿。需改用unload()方法销毁实例、释放资源,同时移除不必要的e.preventDefault()(会触发浏览器确认弹窗且不影响资源释放逻辑)。

修改后的beforeunload代码:

window.addEventListener('beforeunload', function() {
  Object.values(player).forEach(p => {
    if (p && p instanceof Howl) {
      p.unload(); // 彻底销毁音频实例,释放底层HTML5 Audio资源
    }
  });
});

二、解决暂停后无法续播问题

HTML5模式下,Howler默认不会自动保留暂停时的播放位置,需手动记录进度并在播放时跳转至对应位置。

修改核心逻辑代码:

let player = {}; // 改用对象存储实例,适配ID作为键的场景
let playPositions = {}; // 保存每个音频的播放进度

$('.g-player').each(function(){
  let id = $(this).data('id');
  player[id] = new Howl({
    src: [g.ajaxurl+'?nonce='+g.nonce+'&action=g_audio&id='+id],
    preload: true,
    format: ['flac'],
    html5: true,
    onend: function() {
      playPositions[id] = 0; // 播放完毕后重置进度
      $(`.g-player[data-id="${id}"]`).removeClass('playing').addClass('paused');
    }
  });
  playPositions[id] = 0; // 初始化进度为0
});

// 播放事件
$(document).on('click', '.g-player:not(.playing)', function(){
  let id = $(this).data('id');
  let howl = player[id];
  howl.seek(playPositions[id]); // 跳转至保存的进度
  howl.play();
  $(this).addClass('playing').removeClass('paused');
});

// 暂停事件
$(document).on('click', '.g-player.playing', function(){
  let id = $(this).data('id');
  let howl = player[id];
  playPositions[id] = howl.seek(); // 暂停前记录当前进度
  howl.pause();
  $(this).toggleClass('playing paused');
});

验证效果

同时应用上述修改后,在Chrome(含移动版)、Edge浏览器中测试:

  • 播放状态下跳转/刷新页面无卡顿
  • 暂停后再次点击可从暂停位置续播

内容的提问来源于stack exchange,提问作者ygnsl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:22:26