MediaWiki:Gadget-AudioText.js:修订间差异
外观
![]() OctoberSama(留言 | 贡献) 小 |
![]() OctoberSama(留言 | 贡献) 小 |
||
第1行: | 第1行: | ||
// MediaWiki:Gadget-AudioText.js | // MediaWiki:Gadget-AudioText.js | ||
(function() { | (function() { | ||
// | // ========== 阶段1:全局初始化追踪 ========== | ||
alert(" | 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() { | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() { | ||
alert(" | alert("[3/5] ✅ 核心依赖已加载"); | ||
// | // ========== 阶段4:主逻辑定义 ========== | ||
const initAudioSystem = function() { | |||
try { | try { | ||
alert(" | // 调试:检查页面元素 | ||
const elements = document.querySelectorAll('.audio-trigger'); | |||
// | if (elements.length === 0) { | ||
const audioFile = element.dataset.audioFile; | 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(); | |||
alert(" | 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) { | } catch(e) { | ||
alert( | alert("[初始化X] 💣 系统崩溃: " + e.message); | ||
} | } | ||
}; | }; | ||
// | // ========== 强制初始化机制 ========== | ||
if (document.readyState === 'complete') { | if (document.readyState === 'complete') { | ||
alert("⚡ | alert("[5/5] ⚡ 文档已就绪,立即初始化"); | ||
initAudioSystem(); | |||
} else { | } else { | ||
alert("⏳ | alert("[5/5] ⏳ 等待文档加载完成"); | ||
document.addEventListener('DOMContentLoaded', | document.addEventListener('DOMContentLoaded', initAudioSystem); | ||
} | } | ||
// 动态内容监听 | // 动态内容监听 | ||
mw.hook('wikipage.content').add( | mw.hook('wikipage.content').add(() => { | ||
alert(" | alert("[动态] 检测到新内容,重新初始化"); | ||
initAudioSystem(); | |||
}); | }); | ||
}, function(error) { | }, function(error) { | ||
alert( | alert("[依赖X] ❌ 依赖加载失败: " + error.toString()); | ||
}); | }); | ||
})(); | })(); |
2025年5月24日 (六) 23:03的版本
// 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()); }); })();