MediaWiki:Common.js:修订间差异
来自Mindustry中文wiki
无编辑摘要 |
无编辑摘要 |
||
| 第12行: | 第12行: | ||
}); | }); | ||
}); | }); | ||
/ | // Mindustry 顶部导航栏 | ||
$(document).ready(function() { | $(document).ready(function() { | ||
// 1. 定义菜单内容 (直接写死白色字体,防止看不见) | // 1. 定义菜单内容 (直接写死白色字体,防止看不见) | ||
| 第39行: | 第39行: | ||
console.log("Mindustry 导航栏脚本已执行"); | console.log("Mindustry 导航栏脚本已执行"); | ||
}); | }); | ||
mw.loader.using(['mediawiki.util'], function () { | |||
mw.loader.using(['mediawiki.util'], function () { | |||
if (mw.config.get('skin') !== 'timeless') return; | if (mw.config.get('skin') !== 'timeless') return; | ||
var | var siteNav = document.getElementById('mw-site-navigation'); | ||
if (!siteNav) return; | |||
if (! | |||
var pNav = siteNav.querySelector('#p-navigation'); | |||
if (!pNav) return; | |||
var root = pNav.querySelector('.mw-portlet-body > ul'); | |||
if (!root) return; | |||
var KEY = 'mdtNavTreeOpen'; | |||
var store = {}; | |||
try { store = JSON.parse(localStorage.getItem(KEY) || '{}'); } | |||
catch (e) {} | |||
function getKey(li) { | function getKey(li) { | ||
if (li.id) return li.id; | if (li.id) return li.id; | ||
var a = li.querySelector('a'); | var a = li.querySelector('a'); | ||
return a ? (a.getAttribute('href') || '') : ''; | |||
} | } | ||
function setOpen(li, open) { | function setOpen(li, open) { | ||
li.classList.toggle(' | li.classList.toggle('mdtNavOpen', open); | ||
var | var k = getKey(li); | ||
if (! | if (!k) return; | ||
store[k] = open; | |||
localStorage.setItem( | localStorage.setItem(KEY, JSON.stringify(store)); | ||
} | } | ||
function ensureGroup( | function ensureGroup(li) { | ||
li.classList.add('mdtNavGroup'); | |||
var sub = | var sub = li.querySelector('ul.mdtNavSublist'); | ||
if (!sub) { | if (!sub) { | ||
sub = document.createElement('ul'); | sub = document.createElement('ul'); | ||
sub.className = ' | sub.className = 'mdtNavSublist'; | ||
li.appendChild(sub); | |||
} | } | ||
var btn = | var btn = li.querySelector('button.mdtNavToggle'); | ||
if (!btn) { | if (!btn) { | ||
btn = document.createElement('button'); | btn = document.createElement('button'); | ||
btn.type = 'button'; | btn.type = 'button'; | ||
btn.className = ' | btn.className = 'mdtNavToggle'; | ||
btn.setAttribute('aria-label', '展开/收起'); | btn.setAttribute('aria-label', '展开/收起'); | ||
li.insertBefore(btn, sub); | |||
btn.addEventListener('click', function (ev) { | btn.addEventListener('click', function (ev) { | ||
ev.preventDefault(); | ev.preventDefault(); | ||
ev.stopPropagation(); | ev.stopPropagation(); | ||
setOpen(li, !li.classList.contains('mdtNavOpen')); | |||
}); | }); | ||
} | } | ||
var | var k = getKey(li); | ||
if ( | if (store[k] === true) li.classList.add('mdtNavOpen'); | ||
return sub; | return sub; | ||
} | } | ||
var items = Array. | var items = Array.prototype.slice.call(root.children); | ||
var lastAtDepth = []; | var lastAtDepth = []; | ||
for (var | for (var i = 0; i < items.length; i++) { | ||
var li = items[ | var li = items[i]; | ||
if (!li || li.tagName !== 'LI') continue; | if (!li || li.tagName !== 'LI') continue; | ||
| 第138行: | 第112行: | ||
var raw = (a.textContent || '').trim(); | var raw = (a.textContent || '').trim(); | ||
var m = raw.match(/^(-{2,})\s | var m = raw.match(/^(-{2,})\\s*(.*)$/); | ||
var depth = 0; | var depth = 0; | ||
| 第146行: | 第120行: | ||
} | } | ||
li.classList.add(' | li.classList.add('mdtNavItem'); | ||
if (depth > 0 | if (depth > 0 && lastAtDepth[depth - 1]) { | ||
li.classList.add('mdtNavSubItem'); | |||
var sublist = ensureGroup( | li.classList.add('mdtNavDepth' + depth); | ||
var sublist = ensureGroup(lastAtDepth[depth - 1]); | |||
sublist.appendChild(li); | sublist.appendChild(li); | ||
} else { | |||
depth = 0; | |||
} | } | ||
| 第166行: | 第136行: | ||
var current = mw.config.get('wgPageName'); | var current = mw.config.get('wgPageName'); | ||
var links = | var links = pNav.querySelectorAll('a'); | ||
for (var j = 0; j < links.length; j++) { | for (var j = 0; j < links.length; j++) { | ||
var | var href = links[j].getAttribute('href') || ''; | ||
if (page | var page = mw.util.getParamValue('title', href); | ||
if (!page) { | |||
var mark = '/index.php/'; | |||
var pos = href.indexOf(mark); | |||
if (pos !== -1) { | |||
page = decodeURIComponent(href.slice(pos + mark.length)); | |||
} | |||
} | |||
if (page) page = page.replace(/ /g, '_'); | |||
if (page === current) { | |||
links[j].classList.add('mdtNavActive'); | |||
var n = links[j].parentNode; | |||
while (n && n !== root) { | |||
if (n.tagName === 'LI' && | |||
n.classList.contains('mdtNavGroup')) { | |||
setOpen(n, true); | |||
} | |||
n = n.parentNode; | |||
} | |||
break; | |||
} | |||
} | } | ||
}); | }); | ||
2026年1月8日 (四) 14:22的版本
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
/* 点击按钮复制内容的脚本 */
$(function() {
$('.copy-button').click(function() {
var text = $(this).attr('data-text');
var $temp = $("<textarea>");
$("body").append($temp);
$temp.val(text).select();
document.execCommand("copy");
$temp.remove();
alert("复制成功!");
});
});
// Mindustry 顶部导航栏
$(document).ready(function() {
// 1. 定义菜单内容 (直接写死白色字体,防止看不见)
var myMenu = `
<div id="mindustry-nav" style="display: flex; align-items: center; height: 100%; margin-left: 20px; z-index: 999;">
<a href="/index.php/首页" style="color: #fff !important; font-weight: bold; font-size: 16px; margin-right: 20px; text-decoration: none;">首页</a>
<a href="/index.php/单位" style="color: #fff !important; font-weight: bold; font-size: 16px; margin-right: 20px; text-decoration: none;">单位</a>
<a href="/index.php/建筑" style="color: #fff !important; font-weight: bold; font-size: 16px; margin-right: 20px; text-decoration: none;">建筑</a>
<a href="/index.php/逻辑" style="color: #fff !important; font-weight: bold; font-size: 16px; margin-right: 20px; text-decoration: none;">逻辑</a>
</div>
`;
// 2. 尝试插入到 Logo 所在的容器中
// Vector 2022 的 Logo 容器通常叫 .vector-header-start
var target = $('.vector-header-start');
// 如果找不到,尝试找 .mw-logo (旧版兼容)
if (target.length === 0) {
target = $('.mw-logo').parent();
}
// 执行插入
target.append(myMenu);
// 3. 调试信息 (按F12看控制台用)
console.log("Mindustry 导航栏脚本已执行");
});
mw.loader.using(['mediawiki.util'], function () {
if (mw.config.get('skin') !== 'timeless') return;
var siteNav = document.getElementById('mw-site-navigation');
if (!siteNav) return;
var pNav = siteNav.querySelector('#p-navigation');
if (!pNav) return;
var root = pNav.querySelector('.mw-portlet-body > ul');
if (!root) return;
var KEY = 'mdtNavTreeOpen';
var store = {};
try { store = JSON.parse(localStorage.getItem(KEY) || '{}'); }
catch (e) {}
function getKey(li) {
if (li.id) return li.id;
var a = li.querySelector('a');
return a ? (a.getAttribute('href') || '') : '';
}
function setOpen(li, open) {
li.classList.toggle('mdtNavOpen', open);
var k = getKey(li);
if (!k) return;
store[k] = open;
localStorage.setItem(KEY, JSON.stringify(store));
}
function ensureGroup(li) {
li.classList.add('mdtNavGroup');
var sub = li.querySelector('ul.mdtNavSublist');
if (!sub) {
sub = document.createElement('ul');
sub.className = 'mdtNavSublist';
li.appendChild(sub);
}
var btn = li.querySelector('button.mdtNavToggle');
if (!btn) {
btn = document.createElement('button');
btn.type = 'button';
btn.className = 'mdtNavToggle';
btn.setAttribute('aria-label', '展开/收起');
li.insertBefore(btn, sub);
btn.addEventListener('click', function (ev) {
ev.preventDefault();
ev.stopPropagation();
setOpen(li, !li.classList.contains('mdtNavOpen'));
});
}
var k = getKey(li);
if (store[k] === true) li.classList.add('mdtNavOpen');
return sub;
}
var items = Array.prototype.slice.call(root.children);
var lastAtDepth = [];
for (var i = 0; i < items.length; i++) {
var li = items[i];
if (!li || li.tagName !== 'LI') continue;
var a = li.querySelector('a');
if (!a) continue;
var raw = (a.textContent || '').trim();
var m = raw.match(/^(-{2,})\\s*(.*)$/);
var depth = 0;
if (m) {
depth = Math.min(Math.floor(m[1].length / 2), 3);
a.textContent = m[2];
}
li.classList.add('mdtNavItem');
if (depth > 0 && lastAtDepth[depth - 1]) {
li.classList.add('mdtNavSubItem');
li.classList.add('mdtNavDepth' + depth);
var sublist = ensureGroup(lastAtDepth[depth - 1]);
sublist.appendChild(li);
} else {
depth = 0;
}
lastAtDepth[depth] = li;
lastAtDepth.length = depth + 1;
}
var current = mw.config.get('wgPageName');
var links = pNav.querySelectorAll('a');
for (var j = 0; j < links.length; j++) {
var href = links[j].getAttribute('href') || '';
var page = mw.util.getParamValue('title', href);
if (!page) {
var mark = '/index.php/';
var pos = href.indexOf(mark);
if (pos !== -1) {
page = decodeURIComponent(href.slice(pos + mark.length));
}
}
if (page) page = page.replace(/ /g, '_');
if (page === current) {
links[j].classList.add('mdtNavActive');
var n = links[j].parentNode;
while (n && n !== root) {
if (n.tagName === 'LI' &&
n.classList.contains('mdtNavGroup')) {
setOpen(n, true);
}
n = n.parentNode;
}
break;
}
}
});
