跳转到内容

MediaWiki:Gadget-AudioText.js:修订间差异

来自电棍ottowiki
第1行: 第1行:
// MediaWiki:Gadget-AudioText.js
// MediaWiki:Gadget-AudioText.js
(function() {
(function() {
     // 阶段1:全局加载确认
     // ========== 阶段1:全局初始化追踪 ==========
     alert("🎯 Gadget脚本已注入页面!");
     alert("[0/5] Gadget脚本开始执行");


     // 阶段2:依赖加载
     // ========== 阶段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("🔋 核心依赖已加载:mediawiki.util/mediawiki.api");
         alert("[3/5] ✅ 核心依赖已加载");
          
          
         // 阶段3:定义全局处理器
         // ========== 阶段4:主逻辑定义 ==========
         window.handleAudioClick = async function(element) {
         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元素");
                alert("🗃️ 模板参数:" + audioFile);
                    return;
               
                }
                // API请求
                 alert(`[4/5] ✅ 找到${elements.length}个音频元素`);
                const apiUrl = mw.util.wikiScript('api') +  
 
                    '?action=query&format=json&titles=' +  
                 // 定义播放逻辑
                    encodeURIComponent(audioFile) +  
                 const handleClick = async (element) => {
                    '&prop=imageinfo&iiprop=url';
                    try {
                alert("📡 请求API:" + apiUrl);
                        // 获取音频参数
               
                        const audioFile = element.dataset.audioFile;
                const response = await fetch(apiUrl);
                        alert("[播放1] 模板参数: " + audioFile);
                const data = await response.json();
 
                const pages = data.query.pages;
                        // 构造API请求
                const pageId = Object.keys(pages)[0];
                        const apiUrl = mw.util.wikiScript('api') +  
                const audioUrl = pages[pageId].imageinfo[0].url;
                            '?action=query&format=json&titles=' +  
                alert("🔗 解析音频URL:" + audioUrl);
                            encodeURIComponent(audioFile) +  
               
                            '&prop=imageinfo&iiprop=url';
                // 播放逻辑
                        alert("[播放2] 请求API: " + apiUrl);
                const audio = new Audio(audioUrl);
 
                audio.play().then(() => {
                        // 获取音频URL
                    alert("✅ 播放成功!");
                        const response = await fetch(apiUrl);
                }).catch(e => {
                        const data = await response.json();
                     alert("❌ 播放失败:" + e.message);
                        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(`💥 发生未捕获异常:${e.message}`);
                 alert("[初始化X] 💣 系统崩溃: " + 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') {
         if (document.readyState === 'complete') {
             alert("⚡ 立即初始化已有内容");
             alert("[5/5] 文档已就绪,立即初始化");
             bindAudioEvents();
             initAudioSystem();
         } else {
         } else {
             alert("⏳ 等待DOM加载完成");
             alert("[5/5] 等待文档加载完成");
             document.addEventListener('DOMContentLoaded', bindAudioEvents);
             document.addEventListener('DOMContentLoaded', initAudioSystem);
         }
         }
       
 
         // 动态内容监听
         // 动态内容监听
         mw.hook('wikipage.content').add(function() {
         mw.hook('wikipage.content').add(() => {
             alert("🔄 检测到新内容加载");
             alert("[动态] 检测到新内容,重新初始化");
             bindAudioEvents();
             initAudioSystem();
         });
         });


     }, function(error) {
     }, function(error) {
         alert(`🚨 依赖加载失败:${error}`);
         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());
    });
})();