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

用戶: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 已經匹配了。