打开/关闭搜索
搜索
打开/关闭菜单
228
885
35
2802
植物大战僵尸杂交版Wiki
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
上传文件
打开/关闭外观设置菜单
notifications
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
user-interface-preferences
个人工具
创建账号
登录
查看“︁MediaWiki:Common.js”︁的源代码
MediaWiki界面页面
查看
阅读
查看源代码
查看历史
associated-pages
系统消息
讨论
更多操作
←
MediaWiki:Common.js
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
此页面为本wiki上的软件提供界面文本,并受到保护以防止滥用。 如欲修改所有wiki的翻译,请访问
translatewiki.net
上的MediaWiki本地化项目。
您无权编辑此JavaScript页面,因为编辑此页面可能会影响所有访问者。
您可以查看和复制此页面的源代码。
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */ // 自动加载 MediaWiki:Footer 页面内容,并插入到每个页面底部 $(document).ready(function() { const namespace = mw.config.get('wgNamespaceNumber'); const action = mw.config.get('wgAction'); if (namespace !== 0 || action !== 'view') { return; } fetch("/api.php?action=parse&page=MediaWiki:Footer&format=json") .then(res => res.json()) .then(data => { if (data.parse && data.parse.text) { const html = data.parse.text['*']; $('#mw-content-text').append('<div class="global-footer">' + html + '</div>'); } }); }); $(function () { // 动态注入彩虹样式 var rainbowStyle = document.createElement('style'); rainbowStyle.textContent = '.rainbow-user {' + 'font-weight: bold;' + 'background: repeating-linear-gradient(90deg, red 0px, orange 10px, yellow 20px, green 30px, blue 40px, indigo 50px, violet 60px);' + '-webkit-background-clip: text;' + '-webkit-text-fill-color: transparent;' + 'background-clip: text;' + 'color: #FFD700;' + '}' + '.rainbow-user::after {' + 'content: "⭐⭐⭐⭐⭐";' + 'margin-left: 2px;' + 'font-weight: normal;' + '-webkit-text-fill-color: initial;' + 'color: #FFD700;' + '}'; document.head.appendChild(rainbowStyle); // 注入状态标签样式 var statusStyle = document.createElement('style'); statusStyle.textContent = '.user-status-dot {' + 'display: inline-block;' + 'width: 8px;' + 'height: 8px;' + 'border-radius: 50%;' + 'margin-left: 4px;' + 'vertical-align: middle;' + '}' + '.status-online { background-color: #4CAF50; }' + // 绿色 '.status-away { background-color: #FF9800; }' + // 橙色 '.status-offline { background-color: #9E9E9E; }'; // 灰色 document.head.appendChild(statusStyle); // ---------- 辅助函数 ---------- function getUserName(link) { var $span = $(link).find('span').first(); if ($span.length) return $span.text().trim(); return $(link).text().trim(); } // 核心:给链接上色 + 状态标签 function colorizeAndStatus($links) { if ($links.length === 0) return; // 过滤出还没处理的链接(避免重复请求) var $fresh = $links.filter(function () { return !$(this).data('user-status-processed'); }); if ($fresh.length === 0) return; // 收集用户名 var users = []; $fresh.each(function () { var name = getUserName(this); if (name && users.indexOf(name) === -1) users.push(name); }); if (users.length === 0) return; // 标记这些链接为已处理(颜色部分) $fresh.each(function () { $(this).data('user-status-processed', true); }); // 1. 先应用颜色(复用原有逻辑) var batchSize = 50; var batches = []; for (var i = 0; i < users.length; i += batchSize) { batches.push(users.slice(i, i + batchSize)); } var processColorBatch = function (batch) { var api = new mw.Api(); return api.get({ action: 'query', list: 'users', ususers: batch.join('|'), usprop: 'editcount' }).then(function (data) { var classMap = {}; if (data.query && data.query.users) { data.query.users.forEach(function (u) { var ec = u.editcount || 0; if (ec >= 5000) classMap[u.name] = 'rainbow-user'; else if (ec >= 2000) classMap[u.name] = 'gold-user'; else if (ec >= 1000) classMap[u.name] = 'platinum-user'; else if (ec >= 500) classMap[u.name] = 'silver-user'; else if (ec >= 1) classMap[u.name] = 'bronze-user'; }); } $fresh.each(function () { var $this = $(this); var name = getUserName(this); var cls = classMap[name]; if (cls) { $this.removeClass('bronze-user silver-user platinum-user gold-user rainbow-user'); $this.addClass(cls); } }); }); }; var colorPromise = $.Deferred().resolve(); batches.forEach(function (batch) { colorPromise = colorPromise.then(function () { return processColorBatch(batch); }); }); // 2. 为每个用户链接添加状态标签(异步,利用缓存) $fresh.each(function () { var $link = $(this); var username = getUserName(this); addStatusDot($link, username); }); } // 给单个链接添加状态圆点 function addStatusDot($link, username) { // 如果已经添加过了就跳过 if ($link.data('status-dot-added')) return; $link.data('status-dot-added', true); // 在链接后面插入圆点容器(如果还没插入) var $dot = $('<span class="user-status-dot status-offline" title="离线">'); $link.after($dot); // 检查本地缓存 var cacheKey = 'mw_user_status_' + mw.config.get('wgDBname') + '_' + username; var cached = localStorage.getItem(cacheKey); var now = Date.now(); if (cached) { try { var data = JSON.parse(cached); // 缓存5分钟 if (now - data.timestamp < 5 * 60 * 1000) { updateDotStyle($dot, data.lastEditTime); return; } } catch (e) {} } // 没有可用缓存,查询 API var api = new mw.Api(); api.get({ action: 'query', list: 'usercontribs', ucuser: username, uclimit: 1, ucprop: 'timestamp' }).then(function (data) { var lastEditTime = null; if (data.query && data.query.usercontribs && data.query.usercontribs.length > 0) { lastEditTime = data.query.usercontribs[0].timestamp; } // 缓存结果 localStorage.setItem(cacheKey, JSON.stringify({ lastEditTime: lastEditTime, timestamp: now })); updateDotStyle($dot, lastEditTime); }).fail(function () { // 查询失败,保留默认灰色 }); } // 根据最后编辑时间更新圆点样式 function updateDotStyle($dot, lastEditTime) { if (!lastEditTime) { $dot.attr('title', '离线'); $dot.removeClass('status-online status-away').addClass('status-offline'); return; } var last = new Date(lastEditTime).getTime(); var now = Date.now(); var diffMinutes = (now - last) / 60000; if (diffMinutes < 15) { $dot.attr('title', '在线(15分钟内活跃)'); $dot.removeClass('status-offline status-away').addClass('status-online'); } else if (diffMinutes < 60) { $dot.attr('title', '近期活跃(1小时内)'); $dot.removeClass('status-offline status-online').addClass('status-away'); } else { $dot.attr('title', '离线'); $dot.removeClass('status-online status-away').addClass('status-offline'); } } // 选择器(正文 + 卡片) var linkSelector = 'a.mw-userlink, .citizen-menu_card-content a, .citizen-userMenu a'; // 初始扫描 colorizeAndStatus($(linkSelector)); // 监听 DOM 变化 var observer = new MutationObserver(function () { colorizeAndStatus($(linkSelector)); }); observer.observe(document.body, { childList: true, subtree: true }); // 定时器兜底(每3秒扫描一次,只处理新链接) setInterval(function () { colorizeAndStatus($(linkSelector)); }, 3000); });
返回
MediaWiki:Common.js
。
查看“︁MediaWiki:Common.js”︁的源代码
MediaWiki界面页面