MediaWiki:Gadget-AudioText.js:修订间差异
外观
![]() OctoberSama(留言 | 贡献) 小 |
![]() OctoberSama(留言 | 贡献) 小 |
||
第1行: | 第1行: | ||
// MediaWiki:Gadget-AudioText.js | // MediaWiki:Gadget-AudioText.js | ||
(function() { | (function() { | ||
// 阶段1:全局加载确认 | |||
alert("🎯 Gadget脚本已注入页面!"); | |||
// 阶段2:依赖加载 | |||
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() { | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() { | ||
alert(" | alert("🔋 核心依赖已加载:mediawiki.util/mediawiki.api"); | ||
// 阶段3:定义全局处理器 | |||
window.handleAudioClick = async function(element) { | |||
try { | try { | ||
alert(" | alert("🖱️ 点击事件进入处理流程"); | ||
// | // 获取音频文件参数 | ||
const audioFile = element.dataset.audioFile; | |||
alert("🗃️ 模板参数:" + audioFile); | |||
// API请求 | |||
const apiUrl = mw.util.wikiScript('api') + | |||
'?action=query&format=json&titles=' + | |||
encodeURIComponent(audioFile) + | |||
'&prop=imageinfo&iiprop=url'; | |||
alert("📡 请求API:" + apiUrl); | |||
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("🔗 解析音频URL:" + audioUrl); | |||
// 播放逻辑 | |||
const audio = new Audio(audioUrl); | |||
audio.play().then(() => { | |||
alert("✅ 播放成功!"); | |||
}).catch(e => { | |||
alert("❌ 播放失败:" + e.message); | |||
}); | |||
} catch(e) { | |||
alert(`💥 发生未捕获异常:${e.message}`); | |||
} | |||
}; | |||
// 阶段4:绑定事件(强化版) | |||
function bindAudioEvents() { | |||
const elements = document.querySelectorAll('.audio-trigger'); | |||
if (elements.length === 0) { | |||
alert("⚠️ 未找到任何.audio-trigger元素!"); | |||
return; | |||
alert( | |||
} | } | ||
} | |||
elements.forEach(element => { | |||
if (element._audioBound) return; | |||
element._audioBound = true; | |||
// 桌面端点击 | |||
element.addEventListener('click', function(e) { | |||
e.preventDefault(); | |||
window.handleAudioClick(element); | |||
}); | |||
// 移动端触摸 | |||
element.addEventListener('touchstart', function(e) { | |||
e.preventDefault(); | |||
window.handleAudioClick(element); | |||
}, { passive: false }); | |||
alert("🔌 已为元素绑定事件:" + element.textContent); | |||
}); | |||
} | |||
// 阶段5:双重初始化 | |||
if (document.readyState === 'complete') { | |||
alert("⚡ 立即初始化已有内容"); | |||
bindAudioEvents(); | |||
} else { | |||
alert("⏳ 等待DOM加载完成"); | |||
document.addEventListener('DOMContentLoaded', bindAudioEvents); | |||
} | |||
// 动态内容监听 | |||
mw.hook('wikipage.content').add(function() { | |||
alert("🔄 检测到新内容加载"); | |||
bindAudioEvents(); | |||
}); | |||
}, function(error) { | }, function(error) { | ||
alert(` | alert(`🚨 依赖加载失败:${error}`); | ||
}); | }); | ||
})(); | })(); |
2025年5月24日 (六) 22:59的版本
// MediaWiki:Gadget-AudioText.js (function() { // 阶段1:全局加载确认 alert("🎯 Gadget脚本已注入页面!"); // 阶段2:依赖加载 mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() { alert("🔋 核心依赖已加载:mediawiki.util/mediawiki.api"); // 阶段3:定义全局处理器 window.handleAudioClick = async function(element) { try { alert("🖱️ 点击事件进入处理流程"); // 获取音频文件参数 const audioFile = element.dataset.audioFile; alert("🗃️ 模板参数:" + audioFile); // API请求 const apiUrl = mw.util.wikiScript('api') + '?action=query&format=json&titles=' + encodeURIComponent(audioFile) + '&prop=imageinfo&iiprop=url'; alert("📡 请求API:" + apiUrl); 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("🔗 解析音频URL:" + audioUrl); // 播放逻辑 const audio = new Audio(audioUrl); audio.play().then(() => { alert("✅ 播放成功!"); }).catch(e => { alert("❌ 播放失败:" + e.message); }); } catch(e) { alert(`💥 发生未捕获异常:${e.message}`); } }; // 阶段4:绑定事件(强化版) function bindAudioEvents() { const elements = document.querySelectorAll('.audio-trigger'); if (elements.length === 0) { alert("⚠️ 未找到任何.audio-trigger元素!"); return; } elements.forEach(element => { if (element._audioBound) return; element._audioBound = true; // 桌面端点击 element.addEventListener('click', function(e) { e.preventDefault(); window.handleAudioClick(element); }); // 移动端触摸 element.addEventListener('touchstart', function(e) { e.preventDefault(); window.handleAudioClick(element); }, { passive: false }); alert("🔌 已为元素绑定事件:" + element.textContent); }); } // 阶段5:双重初始化 if (document.readyState === 'complete') { alert("⚡ 立即初始化已有内容"); bindAudioEvents(); } else { alert("⏳ 等待DOM加载完成"); document.addEventListener('DOMContentLoaded', bindAudioEvents); } // 动态内容监听 mw.hook('wikipage.content').add(function() { alert("🔄 检测到新内容加载"); bindAudioEvents(); }); }, function(error) { alert(`🚨 依赖加载失败:${error}`); }); })();