跳转到内容

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

来自电棍ottowiki
第1行: 第1行:
// MediaWiki:Gadget-AudioText.js
// MediaWiki:Gadget-AudioText.js
(function() {
(function() {
     alert("🔌 Gadget脚本开始执行");
     // 阶段1:全局加载确认
 
     alert("🎯 Gadget脚本已注入页面!");
     if (typeof mw === 'undefined' || !mw.loader) {
        alert("❌ 未检测到MediaWiki核心对象");
        return;
    }


    // 阶段2:依赖加载
     mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {
     mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {
         alert("✅ 依赖加载完成");
         alert("🔋 核心依赖已加载:mediawiki.util/mediawiki.api");
 
       
         const init = function() {
        // 阶段3:定义全局处理器
         window.handleAudioClick = async function(element) {
             try {
             try {
                 alert("🚀 进入主初始化流程");
                 alert("🖱️ 点击事件进入处理流程");
 
               
                 // 新增:定义核心处理函数
                 // 获取音频文件参数
                 const handleClick = async (element) => {
                 const audioFile = element.dataset.audioFile;
                    try {
                alert("🗃️ 模板参数:" + audioFile);
                        alert("🔄 进入点击处理流程");
               
                       
                // API请求
                        // 获取音频文件名
                const apiUrl = mw.util.wikiScript('api') +  
                        const audioFile = element.dataset.audioFile;
                    '?action=query&format=json&titles=' +  
                        alert("📂 模板参数: " + audioFile);
                    encodeURIComponent(audioFile) +  
 
                    '&prop=imageinfo&iiprop=url';
                        // 获取真实URL
                alert("📡 请求API:" + apiUrl);
                        const apiUrl = mw.util.wikiScript('api') + '?action=query&titles=' +  
               
                            encodeURIComponent(audioFile) + '&prop=imageinfo&iiprop=url&format=json';
                const response = await fetch(apiUrl);
                       
                const data = await response.json();
                        alert("🌐 请求API: " + apiUrl);
                const pages = data.query.pages;
                        const response = await fetch(apiUrl);
                const pageId = Object.keys(pages)[0];
                        if (!response.ok) throw new Error("API请求失败: " + response.status);
                const audioUrl = pages[pageId].imageinfo[0].url;
                       
                alert("🔗 解析音频URL:" + audioUrl);
                        const data = await response.json();
               
                        const pages = data.query.pages;
                // 播放逻辑
                        const pageId = Object.keys(pages)[0];
                const audio = new Audio(audioUrl);
                        const audioUrl = pages[pageId].imageinfo[0].url;
                audio.play().then(() => {
                        alert("🔗 解析URL: " + audioUrl);
                    alert("✅ 播放成功!");
 
                }).catch(e => {
                        // 播放音频
                    alert("❌ 播放失败:" + e.message);
                        const audio = new Audio(audioUrl);
                });
                        audio.play().then(() => {
               
                            alert("✅ 播放成功");
            } catch(e) {
                        }).catch(e => {
                alert(`💥 发生未捕获异常:${e.message}`);
                            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("🔗 元素事件已绑定");
                    });
                };


                // 初始化触发
        // 阶段4:绑定事件(强化版)
                if (document.readyState === 'complete') {
        function bindAudioEvents() {
                    alert("⚡ 直接初始化");
            const elements = document.querySelectorAll('.audio-trigger');
                    bindEvents();
             if (elements.length === 0) {
                } else {
                 alert("⚠️ 未找到任何.audio-trigger元素!");
                    alert("⏳ 等待DOM加载");
                return;
                    document.addEventListener('DOMContentLoaded', bindEvents);
                }
 
                mw.hook('wikipage.content').add(bindEvents);
 
             } catch (e) {
                 alert(`💣 初始化崩溃: ${e.message}`);
             }
             }
         };
           
            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);
            });
         }


         init();
         // 阶段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(`🚫 依赖加载失败: ${error}`);
         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}`);
    });

})();