MediaWiki:Common.js

MediaWiki界面页面
XIAOBAIMAO233(留言 | 贡献)2026年9月23日 (三) 23:58的版本

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:按 Ctrl-F5。
( function () {
    function run() {
        var el = document.getElementById( 'xh-server-status' );
        if ( !el ) return;

        var ctrl = new AbortController();
        var timer = setTimeout( function () { ctrl.abort(); }, 6000 );

        fetch( 'https://api.mcsrvstat.us/3/game.xhcity.top', {
            signal: ctrl.signal,
            cache: 'no-store'
        } )
            .then( function ( r ) {
                clearTimeout( timer );
                if ( !r.ok ) throw new Error( r.status );
                return r.json();
            } )
            .then( function ( data ) {
                if ( data.online ) {
                    var online = data.players ? data.players.online : 0;
                    var max = data.players ? data.players.max : '?';
                    el.innerHTML = '<span style="color:#17b3a8; font-weight:700;">● 服务器运行中</span>' +
                        ' &nbsp;·&nbsp; 在线人数:<b style="color:#111827;">' + online + '</b> / ' + max;
                } else {
                    el.innerHTML = '<span style="color:#d22; font-weight:700;">● 服务器已离线</span>';
                }
            } )
            .catch( function () {
                el.innerHTML = '<span style="color:#9ca3af;">● 状态暂时无法获取</span>';
            } );
    }

    /* 等首屏空闲后再请求,避免和页面渲染抢资源 */
    if ( 'requestIdleCallback' in window ) {
        requestIdleCallback( run, { timeout: 3000 } );
    } else {
        setTimeout( run, 1500 );
    }
} )();

/* =====================================================
   首页深色模式适配
   首页大量使用内联硬编码颜色,深色模式下不会自动翻转。
   运行时把内联颜色替换为 CSS 变量,让主题自动切换。
   ===================================================== */
( function () {
    function getPageName() {
        if ( window.mw && mw.config ) return mw.config.get( 'wgPageName' );
        return null;
    }

    function replaceColors() {
        var nodes = document.querySelectorAll( '[style]' );

        /* 顺序很重要:先处理组合属性,再处理单个颜色 */
        var map = [
            /* 主要信息标题栏:作为背景的 #111827 必须最先处理 */
            [ /background(?:-color)?\s*:\s*#111827\b/gi, 'background:var(--xh-header-bar-bg)' ],
            /* 背景色 */
            [ /#ffffff\b/gi,  'var(--xh-card-bg)' ],
            [ /#fbfefe\b/gi,  'var(--xh-card-bg-soft)' ],
            [ /#f3f4f6\b/gi,  'var(--xh-cover-bg)' ],
            /* 边框色 */
            [ /#e5e7eb\b/gi,  'var(--xh-border)' ],
            [ /#f0f0f0\b/gi,  'var(--xh-border-inner)' ],
            /* 文字色(#111827 剩下的都是文字,因为背景已在上面单独处理) */
            [ /#111827\b/gi,  'var(--xh-text-strong)' ],
            [ /#4b5563\b/gi,  'var(--xh-text)' ],
            [ /#6b7280\b/gi,  'var(--xh-text-soft)' ],
            [ /#9ca3af\b/gi,  'var(--xh-text-faint)' ]
        ];

        for ( var i = 0; i < nodes.length; i++ ) {
            var el = nodes[ i ];
            var s = el.getAttribute( 'style' );
            if ( !s ) continue;
            var changed = false;
            for ( var j = 0; j < map.length; j++ ) {
                var re = map[ j ][ 0 ];
                re.lastIndex = 0;
                if ( re.test( s ) ) {
                    re.lastIndex = 0;
                    s = s.replace( re, map[ j ][ 1 ] );
                    changed = true;
                }
            }
            if ( changed ) el.setAttribute( 'style', s );
        }
    }

    function init() {
        if ( getPageName() !== '首页' ) return;
        replaceColors();
    }

    if ( document.readyState === 'loading' ) {
        document.addEventListener( 'DOMContentLoaded', init );
    } else {
        init();
    }
} )();