无服务器权限无法装扩展,如何实现MediaWiki动态页面节模板?
解决DynamicPageSections模板空输出问题的方案
核心思路
MediaWiki模板是服务器端解析,自定义JS则是客户端执行,两者时序不同——模板渲染时JS还未运行,所以直接尝试把JS生成的结构传给模板必然得到空值。正确做法是:模板提供带标识的占位元素,JS识别该元素后,通过API拉取页面节数据,动态生成有序列表并替换占位内容。
步骤1:创建模板代码
在Wiki中创建Template:DynamicPageSections,内容如下:
<div class="dynamic-page-sections" data-page="{{{page_title|{{PAGENAME}}}}}"> <!-- JS将替换此注释为节列表 --> </div>
data-page属性存储目标页面名称,默认使用当前页面({{PAGENAME}}),支持通过page_title参数指定- 空div作为JS的目标占位容器
步骤2:编写Common.js处理逻辑
在MediaWiki:Common.js中添加以下代码:
// 等待页面DOM加载完成后执行 $(document).ready(function() { // 遍历所有动态节列表占位符 $('.dynamic-page-sections').each(function() { const $container = $(this); const targetPage = $container.data('page'); // 调用MediaWiki API获取页面节数据 $.getJSON('/api.php', { action: 'parse', page: targetPage, prop: 'sections', format: 'json' }).done(function(data) { if (data.parse && data.parse.sections) { // 生成有序列表 const $ol = $('<ol></ol>'); data.parse.sections.forEach(section => { // 跳过顶级空节(部分页面会返回无效空节) if (section.line.trim() === '') return; // 生成标准内部链接并转成HTML const linkUrl = mw.util.getUrl(targetPage + '#' + section.anchor); const $link = $('<a>').attr('href', linkUrl).text(section.line); $ol.append($('<li>').append($link)); }); // 替换占位符内容 $container.html($ol); } else { $container.html('<p>无法加载页面节数据</p>'); } }).fail(function() { $container.html('<p>加载页面节数据失败</p>'); }); }); });
代码说明:
- 用
action=parse+prop=sections的API组合直接获取结构化的节数据,避免XML解析的繁琐 - 借助
mw.util.getUrl生成符合Wiki规则的内部链接,适配不同URL路径配置 - 处理了API请求失败、无有效节数据的异常场景
步骤3:测试模板使用
在任意页面调用模板:
{{DynamicPageSections|page_title=目标页面名称}}
页面加载完成后,JS会自动将占位符替换为目标页面的节有序列表,每个列表项都直接链接到对应节的锚点。
常见问题排查
- 仍显示空内容:打开浏览器控制台检查JS报错,排查页面名称拼写错误、API请求权限问题(专用部署一般无此问题)
- 节列表不全:部分隐藏节或特殊节可能不被API返回,可在API参数中添加
disablepp=1尝试 - 链接跳转异常:若Wiki使用非标准URL路径,调整
mw.util.getUrl的参数格式即可适配
内容的提问来源于stack exchange,提问作者Elad Ratson
相关产品推荐
相关产品推荐

