跳转到内容

MediaWiki:Gadget-AudioText.js

来自电棍ottowiki
OctoberSama留言 | 贡献2025年5月24日 (六) 22:59的版本

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
// 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}`);
    });

})();