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

如何移除事件监听器中的音频函数以停止歌曲播放?

解决方案

当前代码的核心问题是:每个playAudioX函数都创建了局部的Audio实例,播放后根本拿不到引用去停止它。要实现关闭模态框时停歌,得这么改:

1. 统一存好所有音频实例

别每次播放都新建局部Audio,搞个全局对象存所有音频实例:

// 全局存储所有音频实例,把对应路径补全就行
const audioInstances = {
  audio1: new Audio("./sounds/Cage-d-Elephant.mp3"),
  audio2: new Audio("./sounds/Colda-War-Kids.mp3"),
  audio3: new Audio("./sounds/[对应foster-the-people的音频路径]"),
  audio4: new Audio("./sounds/[nujabes的音频路径]"),
  audio5: new Audio("./sounds/[omam的音频路径]"),
  audio6: new Audio("./sounds/[senor-loop的音频路径]"),
  audio7: new Audio("./sounds/[tameimpala的音频路径]"),
  audio8: new Audio("./sounds/[blue-stones的音频路径]"),
  audio9: new Audio("./sounds/[默认音频路径]")
};

// 改写playAudio函数,直接用全局实例播放
function playAudio1(){
  audioInstances.audio1.play();
}

function playAudio2(){
  audioInstances.audio2.play();
}

// 其他playAudio3到playAudio9都照这个样子改

2. 写个停所有歌的函数

搞个函数一键暂停所有音频,顺便重置到开头:

function stopAllAudio() {
  Object.values(audioInstances).forEach(audio => {
    audio.pause();
    audio.currentTime = 0; // 重置进度,下次播放从头来
  });
}

3. 关闭模态框时调用停歌函数

修改模态框的点击事件,关模态的时候触发停歌:

modal.addEventListener("click",(e)=>{
  if(e.target.classList.contains("modal")){
    modal.classList.remove("open");
    popImage.classList.remove("open");
    stopAllAudio(); // 加这行,关模态就停歌
  }
});

关于移除captionAudio(selected_image)的说明

要是你只是想点击按钮时不自动播歌,直接删掉按钮点击事件里的captionAudio(selected_image);这行就行。但如果要保留“点按钮播歌、关模态停歌”的功能,就别删这行,配合上面的代码用就行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:24:46