MediaWiki:Common.js:修订间差异

Ztm0929留言 | 贡献
移除上传文件、固定链接、引用此页
Ztm0929留言 | 贡献
尝试增加针对移动端的紧凑模式识别
标签已被回退
第31行: 第31行:


// logo 切换逻辑
// logo 切换逻辑
// Common.js - footer logo 切换逻辑
$(function () {
$(function () {
     // 获取当前“实际使用”的主题:'dark' 或 'light'
     // ======================
    // 工具函数
    // ======================
 
    // 判断当前主题:dark / light
     function getEffectiveTheme() {
     function getEffectiveTheme() {
         var cls = document.documentElement.classList;
         var cls = document.documentElement.classList;
第43行: 第48行:
             return 'light';
             return 'light';
         }
         }
         // 兜底:根据系统偏好判断
         // 兜底:系统偏好
         if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
         if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
             return 'dark';
             return 'dark';
第50行: 第55行:
     }
     }


     // 如果元素存在就设置 src(并记录日志)
    // 判断是否为移动端 compact 模式(小图)
    function isCompactMode() {
        return window.matchMedia && window.matchMedia('(max-width: 500px)').matches;
    }
 
     // 如果元素存在就设置 src
     function setSrcIfExists(selector, src) {
     function setSrcIfExists(selector, src) {
         var $el = $(selector);
         var $el = $(selector);
第56行: 第66行:
             $el.attr('src', src);
             $el.attr('src', src);
             console.log('[logo-switch] set', selector, '->', src);
             console.log('[logo-switch] set', selector, '->', src);
        } else {
            console.log('[logo-switch] not found', selector);
         }
         }
     }
     }


     // 主更新函数 —— 每次都重新 select 元素
     // ======================
    // 主更新逻辑
    // ======================
     function updateLogos() {
     function updateLogos() {
         var theme = getEffectiveTheme();
         var theme = getEffectiveTheme();
        var compact = isCompactMode();
        // 文件名后缀
        var suffix = '';
        if (compact) {
            suffix += '-compact';
        }
         if (theme === 'dark') {
         if (theme === 'dark') {
             setSrcIfExists('#footer-copyrightico img', '/resources/assets/cc-by-nc-sa-dark.svg');
             suffix += '-dark';
            setSrcIfExists('#footer-poweredbyico img', '/resources/assets/poweredby-mediawiki-dark.svg');
        }
            setSrcIfExists('#footer-poweredbysmwico img', '/resources/assets/poweredby-smw-dark.svg');  
 
         } else {
        // 公共 logo(所有皮肤都显示)
            setSrcIfExists('#footer-copyrightico img', '/resources/assets/cc-by-nc-sa.svg');
        setSrcIfExists('#footer-copyrightico img', '/resources/assets/cc-by-nc-sa' + suffix + '.svg');
             setSrcIfExists('#footer-poweredbyico img', '/resources/assets/poweredby-mediawiki.svg');
        setSrcIfExists('#footer-poweredbyico img', '/resources/assets/poweredby-mediawiki' + suffix + '.svg');
            setSrcIfExists('#footer-poweredbysmwico img', '/resources/assets/poweredby-smw.svg');  
        setSrcIfExists('#footer-poweredbysmwico img', '/resources/assets/poweredby-smw' + suffix + '.svg');
 
         // Citizen 专属(仅当元素存在时才切换)
        if (document.body.classList.contains('skin-Citizen')) {
             setSrcIfExists('#footer-poweredbycitizenico img', '/resources/assets/poweredby-citizen' + suffix + '.svg');
         }
         }
     }
     }
    // ======================
    // 触发时机
    // ======================


     // 首次运行
     // 首次运行
     updateLogos();
     updateLogos();


     // 监听 <html> class 变化(用户在 UI 切换浅/深/自动)
     // 监听 <html> class 变化(主题切换)
     var htmlObserver = new MutationObserver(function (mutations) {
     var htmlObserver = new MutationObserver(function (mutations) {
         for (var i = 0; i < mutations.length; i++) {
         for (var i = 0; i < mutations.length; i++) {
第89行: 第114行:
     htmlObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });
     htmlObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });


     // 监听 body DOM 变动,防止 footer 异步插入或被替换
     // 监听 body DOM 变动,防止 footer 异步插入
     var bodyObserver = new MutationObserver(function () {
     var bodyObserver = new MutationObserver(function () {
         updateLogos();
         updateLogos();
第95行: 第120行:
     bodyObserver.observe(document.body, { childList: true, subtree: true });
     bodyObserver.observe(document.body, { childList: true, subtree: true });


     // 监听系统主题变化(适用于 skin-theme-clientpref-os)
     // 监听系统主题变化
     if (window.matchMedia) {
     if (window.matchMedia) {
         var mq = window.matchMedia('(prefers-color-scheme: dark)');
         var mqDark = window.matchMedia('(prefers-color-scheme: dark)');
         if (typeof mq.addEventListener === 'function') {
         if (typeof mqDark.addEventListener === 'function') {
             mq.addEventListener('change', updateLogos);
             mqDark.addEventListener('change', updateLogos);
         } else if (typeof mq.addListener === 'function') {
         } else if (typeof mqDark.addListener === 'function') {
             // 兼容旧浏览器
             mqDark.addListener(updateLogos);
             mq.addListener(updateLogos);
        }
 
        // 监听屏幕宽度变化(compact <-> normal)
        var mqCompact = window.matchMedia('(max-width: 500px)');
        if (typeof mqCompact.addEventListener === 'function') {
            mqCompact.addEventListener('change', updateLogos);
        } else if (typeof mqCompact.addListener === 'function') {
             mqCompact.addListener(updateLogos);
         }
         }
     }
     }


     // 如果存在 MediaWiki 的 hook(例如偏好保存后),也触发一次
     // MediaWiki hook
     if (window.mw && mw.hook) {
     if (window.mw && mw.hook) {
         mw.hook('user.preferencesSaved').add(updateLogos);
         mw.hook('user.preferencesSaved').add(updateLogos);
     }
     }


     // 兜底:页面 load 后、以及延迟 1.5s 再试一次
     // 兜底:页面 load 后、延迟再执行一次
     $(window).on('load', updateLogos);
     $(window).on('load', updateLogos);
     setTimeout(updateLogos, 1500);
     setTimeout(updateLogos, 1500);
});
});