注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- 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>' +
' · 在线人数:<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();
}
} )();