跳转到内容

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

来自电棍ottowiki
 
(未显示同一用户的10个中间版本)
第1行: 第1行:
// MediaWiki:Gadget-AudioText.js
// MediaWiki:Gadget-AudioText.js
(function() {
(function() {
     // 阶段1:检测Gadget是否被加载
     const audioUrlCache = new Map();
    alert("🔌 Gadget脚本开始执行"); // 最基础提示,确认脚本被加载


     // 阶段2:声明依赖并验证mw对象
     // 播放音频核心逻辑
     if (typeof mw === 'undefined' || !mw.loader) {
     function handlePlay(element) {
        alert("❌ 致命错误:未检测到MediaWiki核心对象");
         const audioFile = element.dataset.audioFile;
        return;
    }
 
    // 阶段3:加载必需依赖
    mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {
         alert("✅ 依赖加载完成:mediawiki.util/mediawiki.api"); // 依赖加载确认
          
          
         // 阶段4:主初始化函数
         // 优先使用缓存
         const init = function() {
         if (audioUrlCache.has(audioFile)) {
             try {
             new Audio(audioUrlCache.get(audioFile)).play();
                alert("🚀 进入主初始化流程");
            return;
               
        }
                // 阶段5:绑定事件
                const bindEvents = function() {
                    const elements = document.querySelectorAll('.audio-trigger');
                    if (elements.length === 0) {
                        alert("⚠️ 未找到.audio-trigger元素,请检查模板调用");
                        return;
                    }


                    elements.forEach(element => {
        // 通过API获取真实URL
                        if (element._bound) return;
        const apiUrl = mw.util.wikiScript('api') + '?action=query&titles=' +
                        element._bound = true;
            encodeURIComponent(audioFile) + '&prop=imageinfo&iiprop=url&format=json';
                       
                        // 强制绑定双事件
                        const handler = () => {
                            alert("🖱️ 事件触发!开始处理...");
                            handleClick(element).catch(e => {
                                alert(`💥 处理异常: ${e.message}`);
                            });
                        };
                       
                        element.addEventListener('click', handler);
                        element.addEventListener('touchstart', handler);
                        alert("🔗 已为元素绑定事件"); // 每个元素绑定确认
                    });
                };


                // 阶段6:双重初始化机制
        fetch(apiUrl)
                if (document.readyState === 'complete') {
            .then(response => response.json())
                    alert("⚡ 文档已加载完成,立即初始化");
            .then(data => {
                    bindEvents();
                const pages = data.query.pages;
                 } else {
                const pageId = Object.keys(pages)[0];
                    alert("⏳ 注册DOMContentLoaded监听");
                 const audioUrl = pages[pageId].imageinfo[0].url;
                    document.addEventListener('DOMContentLoaded', bindEvents);
                audioUrlCache.set(audioFile, audioUrl);
                }
                new Audio(audioUrl).play();
            });
    }


                // 阶段7:动态内容处理
    // 初始化事件绑定
                mw.hook('wikipage.content').add(function() {
    function initAudioTriggers() {
                    alert("🔄 检测到动态内容加载,重新初始化");
        document.querySelectorAll('.audio-trigger').forEach(element => {
                    bindEvents();
            if (element._audioBound) return;
                });
            element._audioBound = true;


             } catch (e) {
             // 统一事件处理器(不阻止冒泡和默认行为)
                 alert(`💣 初始化崩溃: ${e.message}\n${e.stack}`);
            const handler = (event) => {
             }
                 handlePlay(element);
        };
                // 不调用 event.stopPropagation() 或 event.preventDefault()
             };


        // 启动初始化
            // 同时绑定touch和click(passive模式提升移动端性能)
        init();
            element.addEventListener('touchstart', handler, { passive: true });
 
            element.addEventListener('click', handler);
    }, function(error) {
        });
        alert(`🚫 依赖加载失败: ${error.map(e => e.message).join(', ')}`);
     }
     });


    // 页面加载时初始化
    mw.hook('wikipage.content').add(initAudioTriggers);
    mw.loader.using('mediawiki.api').then(initAudioTriggers);
})();
})();

2025年5月24日 (六) 23:56的最新版本

// MediaWiki:Gadget-AudioText.js
(function() {
    const audioUrlCache = new Map();

    // 播放音频核心逻辑
    function handlePlay(element) {
        const audioFile = element.dataset.audioFile;
        
        // 优先使用缓存
        if (audioUrlCache.has(audioFile)) {
            new Audio(audioUrlCache.get(audioFile)).play();
            return;
        }

        // 通过API获取真实URL
        const apiUrl = mw.util.wikiScript('api') + '?action=query&titles=' + 
            encodeURIComponent(audioFile) + '&prop=imageinfo&iiprop=url&format=json';

        fetch(apiUrl)
            .then(response => response.json())
            .then(data => {
                const pages = data.query.pages;
                const pageId = Object.keys(pages)[0];
                const audioUrl = pages[pageId].imageinfo[0].url;
                audioUrlCache.set(audioFile, audioUrl);
                new Audio(audioUrl).play();
            });
    }

    // 初始化事件绑定
    function initAudioTriggers() {
        document.querySelectorAll('.audio-trigger').forEach(element => {
            if (element._audioBound) return;
            element._audioBound = true;

            // 统一事件处理器(不阻止冒泡和默认行为)
            const handler = (event) => {
                handlePlay(element);
                // 不调用 event.stopPropagation() 或 event.preventDefault()
            };

            // 同时绑定touch和click(passive模式提升移动端性能)
            element.addEventListener('touchstart', handler, { passive: true });
            element.addEventListener('click', handler);
        });
    }

    // 页面加载时初始化
    mw.hook('wikipage.content').add(initAudioTriggers);
    mw.loader.using('mediawiki.api').then(initAudioTriggers);
})();