MediaWiki:Gadget-AudioText.js
外观
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
// MediaWiki:Gadget-AudioText.js (function() { // ========== 阶段1:全局初始化追踪 ========== alert("[0/5] Gadget脚本开始执行"); // ========== 阶段2:基础环境检测 ========== if (typeof mw === 'undefined') { alert("[1/5] ❌ 致命错误:MediaWiki核心对象未定义"); return; } alert("[2/5] ✅ 检测到MediaWiki核心对象"); // ========== 阶段3:强制加载依赖 ========== mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() { alert("[3/5] ✅ 核心依赖已加载"); // ========== 阶段4:主逻辑定义 ========== const initAudioSystem = function() { try { // 调试:检查页面元素 const elements = document.querySelectorAll('.audio-trigger'); if (elements.length === 0) { alert("[4/5] ⚠️ 未找到.audio-trigger元素"); return; } alert(`[4/5] ✅ 找到${elements.length}个音频元素`); // 定义播放逻辑 const handleClick = async (element) => { try { // 获取音频参数 const audioFile = element.dataset.audioFile; alert("[播放1] 模板参数: " + audioFile); // 构造API请求 const apiUrl = mw.util.wikiScript('api') + '?action=query&format=json&titles=' + encodeURIComponent(audioFile) + '&prop=imageinfo&iiprop=url'; alert("[播放2] 请求API: " + apiUrl); // 获取音频URL const response = await fetch(apiUrl); const data = await response.json(); const pages = data.query.pages; const pageId = Object.keys(pages)[0]; const audioUrl = pages[pageId].imageinfo[0].url; alert("[播放3] 解析URL: " + audioUrl); // 立即播放 const audio = new Audio(audioUrl); audio.play().then(() => { alert("[播放4] ✅ 播放成功"); }).catch(e => { alert("[播放5] ❌ 播放失败: " + e.message); }); } catch(e) { alert("[播放X] 💥 全局错误: " + e.message); } }; // ========== 阶段5:事件绑定 ========== elements.forEach(element => { if (element._bound) return; element._bound = true; // 桌面端点击 element.addEventListener('click', (e) => { e.preventDefault(); alert("[事件] 点击事件触发"); handleClick(element); }); // 移动端触摸 element.addEventListener('touchstart', (e) => { e.preventDefault(); alert("[事件] 触摸事件触发"); handleClick(element); }, { passive: false }); alert(`[绑定] 元素已绑定: ${element.textContent}`); }); } catch(e) { alert("[初始化X] 💣 系统崩溃: " + e.message); } }; // ========== 强制初始化机制 ========== if (document.readyState === 'complete') { alert("[5/5] ⚡ 文档已就绪,立即初始化"); initAudioSystem(); } else { alert("[5/5] ⏳ 等待文档加载完成"); document.addEventListener('DOMContentLoaded', initAudioSystem); } // 动态内容监听 mw.hook('wikipage.content').add(() => { alert("[动态] 检测到新内容,重新初始化"); initAudioSystem(); }); }, function(error) { alert("[依赖X] ❌ 依赖加载失败: " + error.toString()); }); })();