跳转到内容

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

来自电棍ottowiki
第1行: 第1行:
// MediaWiki:Gadget-AudioText.js
// MediaWiki:Gadget-AudioText.js
(function() {
(function() {
    // 阶段1:检测Gadget是否被加载
     alert("🔌 Gadget脚本开始执行");
     alert("🔌 Gadget脚本开始执行"); // 最基础提示,确认脚本被加载


    // 阶段2:声明依赖并验证mw对象
     if (typeof mw === 'undefined' || !mw.loader) {
     if (typeof mw === 'undefined' || !mw.loader) {
         alert("❌ 致命错误:未检测到MediaWiki核心对象");
         alert("❌ 未检测到MediaWiki核心对象");
         return;
         return;
     }
     }


    // 阶段3:加载必需依赖
     mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {
     mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {
         alert("✅ 依赖加载完成:mediawiki.util/mediawiki.api"); // 依赖加载确认
         alert("✅ 依赖加载完成");
       
 
        // 阶段4:主初始化函数
         const init = function() {
         const init = function() {
             try {
             try {
                 alert("🚀 进入主初始化流程");
                 alert("🚀 进入主初始化流程");
                  
 
                 // 阶段5:绑定事件
                // 新增:定义核心处理函数
                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("⚠️ 未找到.audio-trigger元素,请检查模板调用");
                         alert("⚠️ 未找到音频触发元素");
                         return;
                         return;
                     }
                     }
第31行: 第63行:
                         element._bound = true;
                         element._bound = true;
                          
                          
                        // 强制绑定双事件
                         const handler = async (event) => {
                         const handler = () => {
                            event.preventDefault();
                             alert("🖱️ 事件触发!开始处理...");
                             alert("🖱️ 点击事件触发");
                             handleClick(element).catch(e => {
                             await handleClick(element);
                                alert(`💥 处理异常: ${e.message}`);
                            });
                         };
                         };
                          
                          
                         element.addEventListener('click', handler);
                         element.addEventListener('click', handler);
                         element.addEventListener('touchstart', handler);
                         element.addEventListener('touchstart', handler);
                         alert("🔗 已为元素绑定事件"); // 每个元素绑定确认
                         alert("🔗 元素事件已绑定");
                     });
                     });
                 };
                 };


                 // 阶段6:双重初始化机制
                 // 初始化触发
                 if (document.readyState === 'complete') {
                 if (document.readyState === 'complete') {
                     alert("⚡ 文档已加载完成,立即初始化");
                     alert("⚡ 直接初始化");
                     bindEvents();
                     bindEvents();
                 } else {
                 } else {
                     alert("⏳ 注册DOMContentLoaded监听");
                     alert("⏳ 等待DOM加载");
                     document.addEventListener('DOMContentLoaded', bindEvents);
                     document.addEventListener('DOMContentLoaded', bindEvents);
                 }
                 }


                // 阶段7:动态内容处理
                 mw.hook('wikipage.content').add(bindEvents);
                 mw.hook('wikipage.content').add(function() {
                    alert("🔄 检测到动态内容加载,重新初始化");
                    bindEvents();
                });


             } catch (e) {
             } catch (e) {
                 alert(`💣 初始化崩溃: ${e.message}\n${e.stack}`);
                 alert(`💣 初始化崩溃: ${e.message}`);
             }
             }
         };
         };


        // 启动初始化
         init();
         init();


     }, function(error) {
     }, function(error) {
         alert(`🚫 依赖加载失败: ${error.map(e => e.message).join(', ')}`);
         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}`);
    });
})();