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