MediaWiki 1.27.4中jQuery未加载,扩展无法使用jquery.cookie求助
嘿,我来帮你搞定这个问题——MediaWiki的ResourceLoader加载逻辑确实有点绕,尤其是在1.27这种老LTS版本里,直接用$或者mw很容易踩坑。咱们一步步来梳理:
核心问题分析
为什么找不到jQuery?
MediaWiki默认确实会加载jQuery,但它不会把$全局暴露(或者加载时机晚于你执行代码的时机)。而且ResourceLoader是异步加载资源的,你直接在PHP自动加载脚本里写$(document).ready()的时候,jQuery还没被加载到页面上,自然会报$未定义。你的模块配置和代码执行时机不对
你虽然声明了模块依赖jquery.cookie,但jquery.cookie依赖的jquery是通过ResourceLoader异步加载的,而你的JS代码直接写在PHP脚本里,会在ResourceLoader加载完依赖之前就执行,所以拿不到$。另外,mw对象也得等ResourceLoader初始化完成后才会存在,所以直接调用mw.loader.load也会报错。
具体解决步骤
1. 调整ResourceLoader模块配置
首先,把你的JS代码从PHP脚本里移到单独的JS文件中,比如在你的扩展目录下创建js/main.js,然后修改模块配置,把这个JS文件加进去:
$wgResourceModules['ext.myFirstExtension'] = array( 'dependencies' => array( 'jquery.cookie' ), 'localBasePath' => dirname( __FILE__ ), 'remoteExtPath' => 'myFirstExtension', 'position' => 'top', 'scripts' => array( 'js/main.js' ) // 新增这一行,指定你的JS文件路径 );
2. 用正确的方式编写JS代码
MediaWiki会把jQuery封装在闭包里,你需要通过闭包来获取jQuery(也就是$)和mediaWiki(即mw)对象。把你的代码改成这样:
// js/main.js ( function ( $, mw ) { // 等待DOM加载完成 $( document ).ready( function() { alert( "here" ); // 现在可以正常使用$.cookie()了 // 示例:$.cookie('test', 'value'); } ); } )( jQuery, mediaWiki );
这种写法能确保你拿到的$就是jQuery对象,而且是在模块依赖加载完成后才执行的。
3. 在BeforePageDisplay钩子中添加模块
确保你的扩展在BeforePageDisplay钩子中把模块添加到页面输出里:
public static function onBeforePageDisplay( OutputPage $out, Skin $skin ) { $out->addModules( 'ext.myFirstExtension' ); return true; }
这一步很关键,只有把模块添加到输出,ResourceLoader才会加载它和它的所有依赖。
4. 关于Chrome开发者工具中找不到jQuery的问题
你已经开了$wgResourceLoaderDebug = true,这会禁用资源合并,所以你可以在Sources标签里找/resources/lib/jquery/jquery.js这个路径,就能看到原始的jQuery文件了。另外,你也可以在浏览器控制台里输入jQuery(注意是大写开头)来验证是否加载成功——MediaWiki默认会把jQuery暴露到全局,而$需要你自己在闭包里定义。
额外注意点
- 不要直接在PHP脚本里输出JS代码,一定要通过ResourceLoader模块来加载,这样才能保证依赖顺序和加载时机正确。
jquery.cookie模块本身已经依赖jquery了,所以你不需要额外添加jquery到依赖列表里,ResourceLoader会自动加载它的依赖。
内容的提问来源于stack exchange,提问作者Andy Johnson

