MediaWiki:Gadget-AudioText.js:修订间差异
外观
![]() OctoberSama(留言 | 贡献) 小 |
![]() OctoberSama(留言 | 贡献) 小 |
||
第1行: | 第1行: | ||
// MediaWiki:Gadget-AudioText.js | // MediaWiki:Gadget-AudioText.js | ||
(function() { | (function() { | ||
alert("🔌 Gadget脚本开始执行"); | |||
alert("🔌 Gadget脚本开始执行"); | |||
if (typeof mw === 'undefined' || !mw.loader) { | if (typeof mw === 'undefined' || !mw.loader) { | ||
alert("❌ | alert("❌ 未检测到MediaWiki核心对象"); | ||
return; | return; | ||
} | } | ||
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() { | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() { | ||
alert("✅ | alert("✅ 依赖加载完成"); | ||
const init = function() { | const init = function() { | ||
try { | try { | ||
alert("🚀 进入主初始化流程"); | alert("🚀 进入主初始化流程"); | ||
// | // 新增:定义核心处理函数 | ||
const handleClick = async (element) => { | |||
try { | |||
alert("🔄 进入点击处理流程"); | |||
// 获取音频文件名 | |||
const audioFile = element.dataset.audioFile; | |||
alert("📂 模板参数: " + audioFile); | |||
// 获取真实URL | |||
const apiUrl = mw.util.wikiScript('api') + '?action=query&titles=' + | |||
encodeURIComponent(audioFile) + '&prop=imageinfo&iiprop=url&format=json'; | |||
alert("🌐 请求API: " + apiUrl); | |||
const response = await fetch(apiUrl); | |||
if (!response.ok) throw new Error("API请求失败: " + response.status); | |||
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}`); | |||
} | |||
}; | |||
// 事件绑定 | |||
const bindEvents = function() { | const bindEvents = function() { | ||
const elements = document.querySelectorAll('.audio-trigger'); | const elements = document.querySelectorAll('.audio-trigger'); | ||
if (elements.length === 0) { | if (elements.length === 0) { | ||
alert("⚠️ | alert("⚠️ 未找到音频触发元素"); | ||
return; | return; | ||
} | } | ||
第31行: | 第63行: | ||
element._bound = true; | element._bound = true; | ||
const handler = async (event) => { | |||
const handler = () => { | event.preventDefault(); | ||
alert("🖱️ | alert("🖱️ 点击事件触发"); | ||
handleClick(element | await handleClick(element); | ||
}; | }; | ||
element.addEventListener('click', handler); | element.addEventListener('click', handler); | ||
element.addEventListener('touchstart', handler); | element.addEventListener('touchstart', handler); | ||
alert("🔗 | alert("🔗 元素事件已绑定"); | ||
}); | }); | ||
}; | }; | ||
// | // 初始化触发 | ||
if (document.readyState === 'complete') { | if (document.readyState === 'complete') { | ||
alert("⚡ | alert("⚡ 直接初始化"); | ||
bindEvents(); | bindEvents(); | ||
} else { | } else { | ||
alert("⏳ | alert("⏳ 等待DOM加载"); | ||
document.addEventListener('DOMContentLoaded', bindEvents); | document.addEventListener('DOMContentLoaded', bindEvents); | ||
} | } | ||
mw.hook('wikipage.content').add(bindEvents); | |||
mw.hook('wikipage.content').add( | |||
} catch (e) { | } catch (e) { | ||
alert(`💣 初始化崩溃: ${e.message | alert(`💣 初始化崩溃: ${e.message}`); | ||
} | } | ||
}; | }; | ||
init(); | init(); | ||
}, function(error) { | }, function(error) { | ||
alert(`🚫 依赖加载失败: ${error | alert(`🚫 依赖加载失败: ${error}`); | ||
}); | }); | ||
})(); | })(); |
2025年5月24日 (六) 22:55的版本
// MediaWiki:Gadget-AudioText.js (function() { alert("🔌 Gadget脚本开始执行"); if (typeof mw === 'undefined' || !mw.loader) { alert("❌ 未检测到MediaWiki核心对象"); return; } mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() { alert("✅ 依赖加载完成"); const init = function() { try { alert("🚀 进入主初始化流程"); // 新增:定义核心处理函数 const handleClick = async (element) => { try { alert("🔄 进入点击处理流程"); // 获取音频文件名 const audioFile = element.dataset.audioFile; alert("📂 模板参数: " + audioFile); // 获取真实URL const apiUrl = mw.util.wikiScript('api') + '?action=query&titles=' + encodeURIComponent(audioFile) + '&prop=imageinfo&iiprop=url&format=json'; alert("🌐 请求API: " + apiUrl); const response = await fetch(apiUrl); if (!response.ok) throw new Error("API请求失败: " + response.status); 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}`); } }; // 事件绑定 const bindEvents = function() { const elements = document.querySelectorAll('.audio-trigger'); if (elements.length === 0) { alert("⚠️ 未找到音频触发元素"); return; } elements.forEach(element => { if (element._bound) return; element._bound = true; const handler = async (event) => { event.preventDefault(); alert("🖱️ 点击事件触发"); await handleClick(element); }; element.addEventListener('click', handler); element.addEventListener('touchstart', handler); alert("🔗 元素事件已绑定"); }); }; // 初始化触发 if (document.readyState === 'complete') { alert("⚡ 直接初始化"); bindEvents(); } else { alert("⏳ 等待DOM加载"); document.addEventListener('DOMContentLoaded', bindEvents); } mw.hook('wikipage.content').add(bindEvents); } catch (e) { alert(`💣 初始化崩溃: ${e.message}`); } }; init(); }, function(error) { alert(`🚫 依赖加载失败: ${error}`); }); })();