使用标准gamePad代码路径正确仍无法找到声音文件问题求助
问题:使用标准gamePad代码时路径配置正确仍无法加载声音文件
已做过充分调研,Stack Overflow上找到的公开方案经实际验证均无法解决问题,具体现象如下:
- BBEdit的「Markup」菜单预览功能可正常找到并加载声音文件,部署到商业服务器后运行异常
- 键盘按键触发音频播放的逻辑,在本地Mac环境、服务器环境均能正常运行
- 故障复现条件:所有源码上传至服务器后,通过外部服务器运行gamePad代码加载声音文件时,音频无法正常播放
现有文件层级结构
games folder Game_1 folder game1.html Game_Support folder audio folder js folder
现有相关代码
HTML部分
<body onload="doBodyOnLoad()">
JS部分
function doBodyOnLoad() { $(document).ready(function() { // ... // }); // $(document).ready } // doBodyOnload function setupKeypresses() { $(document).keydown(function(evt) { let code = evt.keyCode || evt.which; // 示例逻辑 if (code === "R") { movePaddleRight(); // 该方法会调用下方的ouch() } }); } // setupKeypresses function PlaySound(id, src) { let theSound = new Audio(); theSound.src = src; theSound.play(); } // PlaySound function ouch() { updateScore(--thisScore); // 测试过绝对路径也无法生效 // var theSnd = "http://lovesongforever.com/games/Game_1/Game_1_Support/audio/explosion.mp3"; var theSnd = "Game_1_Support/audio/explosion.mp3"; PlaySound("audioPlaceHolder", theSnd); // 淡出逻辑:整板淡出正常,单独球拍淡出暂未实现 doFade("#gameBoard"); } // ouch
修复方案
按优先级逐个排查即可:
- 先核对路径匹配问题
你给出的文件结构中,game1.html同级的资源文件夹名为Game_Support,但代码里写的路径是Game_1_Support,文件夹名不一致是最常见的404原因。本地BBEdit预览有路径容错机制,可能读取了本地残留的同名旧文件夹所以表现正常,但商业服务器对文件名、大小写的匹配是严格校验的,不会做自动容错。
另外如果上述JS代码存放在js子文件夹中,相对路径需要从js文件的位置开始寻址,正确路径应该是../../Game_Support/audio/explosion.mp3,而不是从html文件位置开始写路径。 - 定位具体报错原因
给音频播放逻辑加错误捕获,打开浏览器控制台看具体报错信息:
同时打开浏览器开发者工具的「网络」面板,筛选音频请求看状态码:function PlaySound(id, src) { let theSound = new Audio(); theSound.src = src; theSound.play().catch(err => console.log('播放失败:', err)); }- 状态码404:回到第一步核对路径、文件名、文件夹大小写
- 状态码403:是服务器限制了音频文件访问,需要给服务器配置.mp3对应的MIME类型
audio/mpeg,给资源目录开放访问权限 - 控制台提示
无用户交互无法自动播放:是浏览器自动播放策略拦截,gamePad输入默认不会被识别为用户主动交互行为,可以在页面首次加载时提示用户按一次键盘任意键完成交互授权,后续gamePad触发的播放就不会被拦截
- 额外逻辑问题修正
现有代码中if (code === "R")的判断永远不会生效,keyCode返回的是数字值,R键对应的编码是82,需要写成if (code === 82)才能正确触发逻辑。
内容的提问来源于stack exchange,提问作者user19147296
相关产品推荐
相关产品推荐

