如何在MediaWiki用户脚本中获取当前页面的命名空间?
如何在MediaWiki用户脚本中获取当前页面的命名空间?
嘿,我来帮你搞定这个问题!你之前遇到的情况其实挺常见的,咱们一步步捋清楚问题出在哪,再给你靠谱的解决办法:
首先说你尝试的 wgCanonicalNamespace —— 这个变量本身是对的,但大概率是访问方式或者时机不对。MediaWiki的配置变量都是通过 mw.config 管理的,直接全局访问可能会因为脚本加载太早(页面还没初始化完这些变量)导致拿不到值。
再看你写的URL截取代码,这里有个明显的错误:slice() 方法需要的是索引位置,不是字符串!所以你那样写肯定得不到正确结果,哪怕URL里有title=和:,也没法正确截取内容。
下面给你两种可行的解决方法,优先推荐第一种:
方法一:用MediaWiki官方配置变量(最稳定)
MediaWiki已经把页面的命名空间信息存在全局配置里了,只要脚本在这些变量初始化后运行,直接用mw.config.get()就能轻松拿到:
// 获取命名空间的名称(比如"User"、"Talk",主命名空间为空字符串) const currentNamespaceName = mw.config.get('wgCanonicalNamespace'); // 或者获取命名空间的数字ID(比如0=主命名空间,2=用户命名空间,4=项目空间) const currentNamespaceId = mw.config.get('wgNamespaceNumber');
要确保脚本在页面加载完成后运行,你可以在用户脚本的元数据里加上@run-at document-end,这样就不会出现变量未定义的情况啦。
方法二:解析URL(不推荐,仅作补充)
如果你实在不想用MediaWiki的全局变量,也可以通过解析URL获取,但这种方法兼容性差(比如遇到友好URL就失效了),还得额外处理主命名空间的情况:
const url = new URL(window.location.href); const titleParam = url.searchParams.get('title'); if (titleParam) { const parts = titleParam.split(':'); // 如果标题里没有冒号,说明是主命名空间 const currentNamespace = parts.length > 1 ? parts[0] : ''; console.log(currentNamespace); }
还是那句话,这种方法不如第一种靠谱,毕竟URL格式可能会变,但应急用用也可以。
备注:内容来源于stack exchange,提问作者TwiWizNeeeArd
相关产品推荐
相关产品推荐

