MediaWiki:Common.js:修订间差异

天明留言 | 贡献
无编辑摘要
标签已被回退
天明留言 | 贡献
无编辑摘要
 
(未显示同一用户的20个中间版本)
第29行: 第29行:
});
});


document.addEventListener("DOMContentLoaded", async () => {
  // 选择要替换的 SVG img
  const poweredSvgImg = document.querySelector('#footer-poweredbyico img[alt="Powered by MyWiki"]');
  if (!poweredSvgImg) return;


  const resp = await fetch(poweredSvgImg.src);
// logo 切换逻辑
  const svgText = await resp.text();
$(function () {
    // 获取当前“实际使用”的主题:'dark' 或 'light'
    function getEffectiveTheme() {
        var cls = document.documentElement.classList;
        if (cls.contains('skin-theme-clientpref-night')) return 'dark';
        if (cls.contains('skin-theme-clientpref-day')) return 'light';
        if (cls.contains('skin-theme-clientpref-os')) {
            if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
                return 'dark';
            }
            return 'light';
        }
        // 兜底:根据系统偏好判断
        if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
            return 'dark';
        }
        return 'light';
    }


  // 创建内联 SVG
    // 如果元素存在就设置 src(并记录日志)
  const wrapper = document.createElement("a");
    function setSrcIfExists(selector, src) {
  wrapper.href = "https://ztm0929.me/";
        var $el = $(selector);
  wrapper.className = "cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled";
        if ($el.length) {
  wrapper.target = "_blank";
            $el.attr('src', src);
  wrapper.innerHTML = svgText;
            console.log('[logo-switch] set', selector, '->', src);
        } else {
            console.log('[logo-switch] not found', selector);
        }
    }


  // 替换原来的 img
    // 主更新函数 —— 每次都重新 select 元素
  poweredSvgImg.replaceWith(wrapper);
    function updateLogos() {
        var theme = getEffectiveTheme();
        if (theme === 'dark') {
            setSrcIfExists('#footer-copyrightico img', '/resources/assets/cc-by-nc-sa-dark.svg');
            setSrcIfExists('#footer-poweredbyico img', '/resources/assets/poweredby-mediawiki-dark.svg');
            setSrcIfExists('#footer-assistedbyico img', '/resources/assets/assistedby-ai-dark.svg');
            setSrcIfExists('#footer-poweredbysmwico img', '/resources/assets/poweredby-smw-dark.svg');  
        } else {
            setSrcIfExists('#footer-copyrightico img', '/resources/assets/cc-by-nc-sa.svg');
            setSrcIfExists('#footer-poweredbyico img', '/resources/assets/poweredby-mediawiki.svg');
            setSrcIfExists('#footer-assistedbyico img', '/resources/assets/assistedby-ai.svg');
            setSrcIfExists('#footer-poweredbysmwico img', '/resources/assets/poweredby-smw.svg');
        }
    }


  // 设置默认颜色
    // 首次运行
  setLogoMode(document.body.classList.contains('skin-theme-clientpref-night') ? 'night' : 'day');
    updateLogos();


  // 可选:监听用户点击按钮切换主题
    // 监听 <html> class 变化(用户在 UI 切换浅//自动)
  document.querySelector('#toggle-theme')?.addEventListener('click', () => {
    var htmlObserver = new MutationObserver(function (mutations) {
     const mode = document.body.classList.contains('skin-theme-clientpref-night') ? 'day' : 'night';
        for (var i = 0; i < mutations.length; i++) {
     document.body.classList.toggle('skin-theme-clientpref-night');
            if (mutations[i].attributeName === 'class') {
     document.body.classList.toggle('skin-theme-clientpref-day');
                updateLogos();
     setLogoMode(mode);
                break;
  });
            }
        }
    });
    htmlObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });
 
    // 监听 body 的 DOM 变动,防止 footer 异步插入或被替换
    var bodyObserver = new MutationObserver(function () {
        updateLogos();
    });
     bodyObserver.observe(document.body, { childList: true, subtree: true });
 
    // 监听系统主题变化(适用于 skin-theme-clientpref-os)
    if (window.matchMedia) {
        var mq = window.matchMedia('(prefers-color-scheme: dark)');
        if (typeof mq.addEventListener === 'function') {
            mq.addEventListener('change', updateLogos);
        } else if (typeof mq.addListener === 'function') {
            // 兼容旧浏览器
            mq.addListener(updateLogos);
        }
     }
 
    // 如果存在 MediaWiki 的 hook(例如偏好保存后),也触发一次
    if (window.mw && mw.hook) {
        mw.hook('user.preferencesSaved').add(updateLogos);
     }
 
    // 兜底:页面 load 后、以及延迟 1.5s 再试一次
    $(window).on('load', updateLogos);
     setTimeout(updateLogos, 1500);
});
});


// 动态修改 SVG 填充颜色
function setLogoMode(mode) {
  const svg = document.querySelector('#footer-poweredbyico a svg');
  if (!svg) return;


  const fills = {
    day: ['#666', '#333', '#1a1a1a', '#000'],  // path1~path4
    night: ['#999', '#ccc', '#e6e6e6', '#fff']
  };


  ['path1','path2','path3','path4'].forEach((cls, idx) => {
 
     const el = svg.querySelector('.' + cls);
// 移除深色模式反馈提示
     if (el) el.setAttribute('fill', fills[mode][idx]);
$(function () {
  });
    function removeBetaNotice() {
}
        var $node = $('#skin-theme-beta-notice');
        if ($node.length) {
            $node.remove();
            // 如果移除了,就断开观察器(可选)
            if (observer) {
                observer.disconnect();
            }
        }
    }
 
    // 第一次尝试
    removeBetaNotice();
 
    // 设置 MutationObserver 观察 body 或 document.body,监视 childList 增删
    var observer = new MutationObserver(function (mutations) {
        // 每次改变 DOM 时尝试移除
        removeBetaNotice();
     });
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });
 
    // 作为兜底:在页面加载完成后一段时间再试一次
     $(window).on('load', function () {
        removeBetaNotice();
    });
    // 再加一个延时
    setTimeout(removeBetaNotice, 2000);
});
 
$(function () {
    // 移除上传文件、固定链接、引用此页
    $('#t-upload, #t-permalink, #t-cite').remove();
});