2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

User:Nbdd0121/萌娘百科技术指南

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索

就与萌娘百科相关的技术内容进行记录。

MediaWiki 1.26 异步加载

由于 MediaWiki 1.26 全面进行了异步加载,导致各种插件、Widgets和Gadgets失效。在bug出现之际引入了很多解决方法,其中包括通过添加defer的script标签,或者用timeout来判断jQ是否加载等等。实际上最简单而且最native的解决方法是通过RLQ。在mw1.26中,所以原先同步加载的部分(比如页面信息的部分),由于异步jQ和mw API的关系而不得不被加入队列,这个队列就是RLQ。所以,通过

window.RLQ = window.RLQ || [];
window.RLQ.push(function(){
  // Something
});

就可以完成Widgets的改造。事实上,由于页面信息的脚本总是早于Widget被载入,所以直接使用 RLQ.push(...) 都没有什么问题。 Gadgets的改造基本上只需要通过在Definition中加入ResourceLoader。

在Widget中获取当前元素

对于需要用脚本控制,但是在一个页面中又可能出现多个的Widget,我们经常需要区分不同的Widget。Widget插件并没有原生的手段来解决这个问题,我之前看到过有人引入一个id进行区分,但这明显会导致编辑难度的加大。一种简单有效的方法是利用HTML Living Standard中的document.currentScript属性 [1] 来获取Widget中当前执行的script,然后再用parentNode或者jQ来获得Widget中的根元素。这在所有非IE浏览器中都能正常工作(So, F*ck you, M$)。在IE中一种Polyfill的手段是获取document.scripts的最后一个元素。

var element = (document.currentScript || document.scripts[document.scripts.length - 1]).parentNode;

一个例子是Widget:Akalin

系统消息重载

重载系统消息时,MediaWiki:XXX 将没有 i18n/lang.json 里的 XXX 优先级高,因为MediaWiki会先尝试搜索XXX/lang,这时候MediaWiki:XXX页面是不匹配的,但是lang.json里面的 XXX 已经匹配了。