无需Ajax,能否在Django HTML模板中通过JS调用音频?
解决Django中音频播放功能失效的问题
当然可以不用Ajax解决,核心问题是你在JS里直接写了音频文件名,没按Django静态文件的规则生成正确路径——浏览器找不到音频文件,自然播放失败。其他静态文件(JS、CSS)正常是因为你可能用了{% static %}标签加载,但音频路径没处理。
具体修复步骤:
在模板中传递静态文件根路径给JS
在你的Django模板HTML的<head>标签里,添加一段脚本,把静态文件的根路径暴露给全局JS:<script> // 定义全局变量,存储Django静态文件根路径 const staticBaseUrl = "{% static '' %}"; </script>注意要确保这段代码在你的音频JS文件之前加载,这样JS才能拿到这个变量。
修正JS中的音频文件路径
把你JS里的Audio实例路径,改成拼接静态根路径的形式,指向/static/hangman_game/下的文件:// 修正音频路径 var yes = new Audio(staticBaseUrl + "hangman_game/yes.wav"); var no = new Audio(staticBaseUrl + "hangman_game/no.wav"); var myAudio = new Audio(staticBaseUrl + "hangman_game/John Jacob Niles - The Maid Freed From The Gallows (1940).mp3"); // 给isPlaying加初始值,否则togglePlay会报错 let isPlaying = false; function togglePlay() { if (isPlaying) { myAudio.pause() } else { myAudio.play(); } }; myAudio.onplaying = function() { isPlaying = true; }; myAudio.onpause = function() { isPlaying = false; }; function checkIt(num) { var matched = false; for (i=0; i<lengthPass; i++) { if(pass.charAt(i) == letters[num]) { pass1 = pass1.setCharacter(i, letters[num]); matched = true; } } if(matched == true) { yes.play(); var element = "let" + num; // 注意:原代码多次重复设置style.background无效,应分开设置属性 document.getElementById(element).style.backgroundColor = "#00C000"; document.getElementById(element).style.border = "3px solid #00C000"; updatePass(); } else { no.play(); } }额外检查项
- 确认模板顶部已经加载
{% load static %}标签; - 检查音频文件名的大小写——Django静态文件路径区分大小写,确保JS里的文件名和服务器上的完全一致;
- 确认模板顶部已经加载
内容的提问来源于stack exchange,提问作者Paweł Pedryc
相关产品推荐
相关产品推荐

