MediaWiki:Common.js
跳转到导航
跳转到搜索
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- 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。
/* =====================================================================
帝鹰维基 · 全站脚本 v13
模块:① 顶部主导航 ② 管理员上传按钮 ③ ♪ 帝鹰电台(侧边栏)
④ 💬 帝鹰聊天室(侧边栏入口 + 弹层 iframe /chat/)
===================================================================== */
(function () {
/* ---------- ① 顶部主导航:改入口就在 links 列表里,一行一个 ---------- */
var links = [
['主站', 'Main_Page'],
['成员专区', '帝鹰核心成员'],
['组织章程', '组织章程'],
['史料归档', '聊天室记录归档'],
['分类', 'Special:Categories']
];
function buildNav() {
if (document.getElementById('dy-topnav')) return;
var nav = document.createElement('nav');
nav.id = 'dy-topnav';
links.forEach(function (it) {
var a = document.createElement('a');
a.href = mw.util.getUrl(it[1]);
a.textContent = it[0];
nav.appendChild(a);
});
var pageBase = document.getElementById('mw-page-base');
if (pageBase && pageBase.parentNode) {
pageBase.parentNode.insertBefore(nav, pageBase);
} else {
document.body.insertBefore(nav, document.body.firstChild);
}
}
/* ---------- ② 管理员专属:右下角「⬆ 上传图片」浮动按钮 ---------- */
function addUploadButton() {
var groups = mw.config.get('wgUserGroups') || [];
if (groups.indexOf('sysop') === -1) return; // 仅管理员可见
if (document.getElementById('dy-upbtn')) return;
var a = document.createElement('a');
a.id = 'dy-upbtn';
a.href = mw.util.getUrl('Special:Upload');
a.textContent = '⬆ 上传图片/头像';
a.title = '管理员专用:从本地上传图片,传完把文件名填进卡片';
document.body.appendChild(a);
}
/* ---------- ③ ♪ 帝鹰电台(侧边栏模块) ----------
曲库来自 /music-list.js(服务器定时生成,window.DY_MUSIC 数组:
[{id,title,src},...]),音频文件在本站 /music/ 目录,跨页不断播由
浏览器自行决定;每个页面独立实例,点击播放即出声。 */
function addRadio(panel, logo) {
if (document.getElementById('dy-radio')) return;
var box = document.createElement('div');
box.id = 'dy-radio';
box.innerHTML =
'<div class="dy-mod-h">♪ 帝鹰电台</div>' +
'<div id="dy-r-title">曲库加载中…</div>' +
'<div id="dy-r-ctl">' +
'<button data-act="prev" title="上一首">⏮</button>' +
'<button data-act="play" title="播放/暂停">▶</button>' +
'<button data-act="next" title="下一首">⏭</button>' +
'</div>';
if (logo && logo.nextSibling) panel.insertBefore(box, logo.nextSibling);
else panel.appendChild(box);
var list = [], idx = 0, audio = null, playing = false;
var titleEl = box.querySelector('#dy-r-title');
var playBtn = box.querySelector('[data-act="play"]');
function ensureAudio() {
if (audio) return;
audio = new Audio();
audio.addEventListener('ended', function () { next(1); });
audio.addEventListener('playing', function () { playing = true; playBtn.textContent = '⏸'; });
audio.addEventListener('pause', function () { playing = false; playBtn.textContent = '▶'; });
}
function show() {
titleEl.textContent = list.length ? ('▶ ' + (idx + 1) + '. ' + list[idx].title) : '曲库为空';
}
function play() {
if (!list.length) return;
ensureAudio();
var want = list[idx].src;
if (audio.src !== location.origin + want && audio.getAttribute('src') !== want) {
audio.src = want; // 首次/切歌:设置源
}
if (playing) { audio.pause(); } else { audio.play(); }
}
function next(step) {
if (!list.length) return;
idx = (idx + step + list.length) % list.length;
if (audio) { audio.src = list[idx].src; audio.play(); }
show();
}
box.addEventListener('click', function (e) {
var act = e.target.getAttribute && e.target.getAttribute('data-act');
if (act === 'play') play();
else if (act === 'next') next(1);
else if (act === 'prev') next(-1);
});
// 曲库脚本:/music-list.js 内容为 window.DY_MUSIC=[...]
var s = document.createElement('script');
s.src = '/music-list.js';
s.onload = function () {
list = (window.DY_MUSIC || []).filter(function (m) { return m && m.src; });
show();
};
s.onerror = function () { titleEl.textContent = '电台曲库暂不可用'; };
document.head.appendChild(s);
}
/* ---------- ④ 💬 帝鹰聊天室(侧边栏入口 + 全屏弹层) ----------
后端 = 同站 /chat/(api.php + index.html 自托管聊天室)。
主内容区不放聊天室,只有侧边栏这一个入口。 */
function addChat(panel, radio) {
if (document.getElementById('dy-chat')) return;
var box = document.createElement('div');
box.id = 'dy-chat';
box.innerHTML =
'<div class="dy-mod-h">💬 帝鹰聊天室</div>' +
'<button id="dy-chat-open">进入聊天室</button>';
if (radio && radio.nextSibling) panel.insertBefore(box, radio.nextSibling);
else panel.appendChild(box);
box.querySelector('#dy-chat-open').addEventListener('click', function () {
var ov = document.getElementById('dy-chat-ov');
if (!ov) {
ov = document.createElement('div');
ov.id = 'dy-chat-ov';
ov.innerHTML =
'<div class="dy-chat-frame">' +
'<div class="dy-chat-bar"><span>帝鹰聊天室</span>' +
'<button id="dy-chat-close">✕ 关闭</button></div>' +
'<iframe src="/chat/index.html" title="帝鹰聊天室"></iframe>' +
'</div>';
document.body.appendChild(ov);
ov.querySelector('#dy-chat-close').addEventListener('click', function () { ov.hidden = true; });
ov.addEventListener('click', function (e) { if (e.target === ov) ov.hidden = true; }); // 点空白处也可关
}
ov.hidden = false;
});
}
/* ---------- 装配入口 ---------- */
function buildSide(panel) {
var logo = document.getElementById('p-logo');
addRadio(panel, logo);
addChat(panel, document.getElementById('dy-radio'));
}
function boot() {
buildNav();
addUploadButton();
var panel = document.getElementById('mw-panel');
if (panel) buildSide(panel);
}
if (window.jQuery && mw && mw.util) {
$(boot);
} else {
document.addEventListener('DOMContentLoaded', boot);
}
})();