如何在Moodle项目中添加jQuery 出现$未定义报错怎么解决
问题原因分析
- Moodle默认开启jQuery无冲突模式
这是最常见的诱因。Moodle核心本身自带jQuery库,为了避免和其他第三方JS库的标识符冲突,默认会执行jQuery.noConflict()方法释放$的使用权,因此直接在代码中调用$会提示未定义。 - jQuery加载顺序晚于调用代码
你在additional.html中添加的外部CDN资源如果加载顺序晚于你自己编写的JS逻辑,就会出现代码执行时jQuery还未加载完成的情况,导致$找不到。另外Moodle自带的JS资源会优先在页面头部加载,如果你有其他区块、插件的JS提前调用了$,也会触发该错误。 - 缓存未清理导致修改未生效
Moodle有多层静态资源缓存机制,修改additional.html后如果没有清理Moodle站点缓存和浏览器本地缓存,旧版本的页面依然会运行,不会加载你新添加的jQuery资源。 - 外部CDN资源加载失败
如果你使用的Google CDN、cdnjs等资源无法正常访问,会导致jQuery文件根本没有加载成功,自然不存在$这个全局变量。
解决方法
- 优先适配Moodle的无冲突模式,不要直接用
$,可以用以下两种写法替代:- 把所有代码中的
$替换为jQuery - 用立即执行函数封装代码,在函数内部继续使用
$:
(function($) { // 该作用域内可正常使用$ $(document).ready(function() { // 你的业务逻辑 }); })(jQuery); - 把所有代码中的
- 调整加载顺序:将你自己编写的JS代码放在
additional.html中jQuery引入代码的下方,或者直接使用Moodle自带的jQuery资源,在后台站点设置中开启自带的jQuery、jQuery UI支持,稳定性更高。 - 修改后先进入Moodle后台【站点管理】-【开发】-【清除所有缓存】,再清除浏览器缓存后重新测试。
- 如果外部CDN访问异常,可以替换为可正常访问的jQuery CDN,或者将jQuery文件下载到本地主题的资源目录中进行本地引用。
内容的提问来源于stack exchange,提问作者Marco Medic
相关产品推荐
相关产品推荐

