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

含井号(#)的音频源无法播放的JavaScript技术问题

解决Audio对象播放含#路径音频的NotSupportedError问题

这个问题我太熟悉了——#在URL里是片段标识符(也就是锚点),浏览器会自动把它当成页面内跳转的标记,而不是文件路径的一部分!哪怕你控制台输出的路径看起来完全正确,实际发送的HTTP请求里,#后面的内容都会被浏览器忽略,导致请求的文件路径不对,自然就抛出了媒体资源不兼容的错误。

至于你尝试用\#替换的方法没用,是因为\只是JavaScript字符串的转义符,转义后传给浏览器的依然是#,浏览器处理URL的时候根本不认这种转义方式,必须用URL编码来处理特殊字符。

给你两个可行的解决方案:

方案1:用encodeURIComponent编码参数(推荐)

这个方法会自动处理所有URL特殊字符(包括#、空格、&等),通用性极强:

function playNote(note) {
  // 对note参数进行URL编码
  let encodedNote = encodeURIComponent(note);
  let audio = new Audio();
  audio.src = "res/tones/" + encodedNote + ".mp3";
  console.log("res/tones/" + encodedNote + ".mp3");
  audio.play();
}

比如你的note是C#,编码后会变成C%23,浏览器就会正确请求res/tones/C%23.mp3,而不会把#当成锚点截断路径。

方案2:手动替换#为%23

如果确定只有#这一种特殊字符,也可以直接替换:

function playNote(note) {
  // 把所有#替换成它的URL编码%23
  let encodedNote = note.replace(/#/g, "%23");
  let audio = new Audio();
  audio.src = "res/tones/" + encodedNote + ".mp3";
  console.log("res/tones/" + encodedNote + ".mp3");
  audio.play();
}

这个方法只针对#生效,适合当前场景,但如果以后note里出现其他特殊字符(比如带空格的文件名),就需要额外处理,所以更推荐方案1。

替换后再测试,你应该就能正常播放带#的音频文件了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:28:05