就与萌娘百科相关的技术内容进行记录。
由于 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插件并没有原生的手段来解决这个问题,我之前看到过有人引入一个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 已经匹配了。