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

JavaScript中点击播放新音乐时如何停止当前正在播放的音乐

原代码失效原因
  • audioplay实例声明在点击事件回调内部,每次点击都会生成全新的Audio对象,无法获取之前正在播放的音频实例,根本无法触发上一首的暂停逻辑
  • 仅通过duration > 0判断音频是否在播放不可靠:音频未完成元数据加载时duration值为NaN,且暂停后不重置播放进度的话,下次触发会从暂停位置续播
  • currentSong变量声明在回调内部,每次点击都会被重置为0,无法记录当前实际播放的曲目索引
可直接运行的正确代码
// 音频实例、当前播放索引移到事件外,全局仅维护一份
let audioplay = null;
let currentSong = 0;

$("body").delegate(".playFreeBeat", "click", function (e) {
  // 新音频播放前,先停止现有正在播放的音频
  if (audioplay) {
    audioplay.pause();
    audioplay.currentTime = 0; // 重置播放进度到开头,避免残留
  } else {
    // 首次点击时创建唯一的Audio实例
    audioplay = new Audio();
  }

  // 替换为你实际的曲目获取逻辑,示例默认取arraySong[0]
  const targetSrc = "./freeAudio/" + arraySong[0].songFiles;
  // 点击同一首歌时切换播放/暂停,不重复加载资源
  if (audioplay.src === location.origin + targetSrc) {
    audioplay.paused ? audioplay.play() : audioplay.pause();
    return;
  }

  // 加载并播放新音频
  audioplay.src = targetSrc;
  audioplay.load();
  audioplay.play().catch(err => {
    // 捕获浏览器自动播放限制等场景的报错
    console.log("播放异常:", err);
  });
});
核心逻辑说明
  • 全局只保留一个Audio实例,所有播放控制都针对这个实例执行,从根源避免重复创建对象导致的控制失效
  • 每次触发播放时优先执行暂停+进度重置操作,确保上一首音频完全停止后再加载新内容
  • 增加同曲目播放状态切换判断,减少不必要的资源加载
  • 补充播放异常捕获,适配现代浏览器的自动播放权限规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:09:18