跳转到内容

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

来自电棍ottowiki
 
(未显示同一用户的8个中间版本)
第1行: 第1行:
// MediaWiki:Gadget-AudioText.js
// MediaWiki:Gadget-AudioText.js
(function() {
(function() {
     // 阶段1:全局加载确认
     const audioUrlCache = new Map();
    alert("🎯 Gadget脚本已注入页面!");


     // 阶段2:依赖加载
     // 播放音频核心逻辑
     mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {
     function handlePlay(element) {
         alert("🔋 核心依赖已加载:mediawiki.util/mediawiki.api");
         const audioFile = element.dataset.audioFile;
          
          
         // 阶段3:定义全局处理器
         // 优先使用缓存
         window.handleAudioClick = async function(element) {
         if (audioUrlCache.has(audioFile)) {
             try {
             new Audio(audioUrlCache.get(audioFile)).play();
                alert("🖱️ 点击事件进入处理流程");
            return;
               
        }
                // 获取音频文件参数
 
                const audioFile = element.dataset.audioFile;
        // 通过API获取真实URL
                alert("🗃️ 模板参数:" + audioFile);
        const apiUrl = mw.util.wikiScript('api') + '?action=query&titles=' +  
               
            encodeURIComponent(audioFile) + '&prop=imageinfo&iiprop=url&format=json';
                // API请求
 
                const apiUrl = mw.util.wikiScript('api') +  
        fetch(apiUrl)
                    '?action=query&format=json&titles=' +  
            .then(response => response.json())
                    encodeURIComponent(audioFile) +  
            .then(data => {
                    '&prop=imageinfo&iiprop=url';
                alert("📡 请求API:" + apiUrl);
               
                const response = await fetch(apiUrl);
                const data = await response.json();
                 const pages = data.query.pages;
                 const pages = data.query.pages;
                 const pageId = Object.keys(pages)[0];
                 const pageId = Object.keys(pages)[0];
                 const audioUrl = pages[pageId].imageinfo[0].url;
                 const audioUrl = pages[pageId].imageinfo[0].url;
                 alert("🔗 解析音频URL:" + audioUrl);
                 audioUrlCache.set(audioFile, audioUrl);
                  
                 new Audio(audioUrl).play();
                // 播放逻辑
            });
                const audio = new Audio(audioUrl);
    }
                audio.play().then(() => {
 
                    alert("✅ 播放成功!");
    // 初始化事件绑定
                }).catch(e => {
    function initAudioTriggers() {
                    alert("❌ 播放失败:" + e.message);
        document.querySelectorAll('.audio-trigger').forEach(element => {
                });
            if (element._audioBound) return;
               
             element._audioBound = true;
            } catch(e) {
                alert(`💥 发生未捕获异常:${e.message}`);
             }
        };


        // 阶段4:绑定事件(强化版)
            // 统一事件处理器(不阻止冒泡和默认行为)
        function bindAudioEvents() {
             const handler = (event) => {
             const elements = document.querySelectorAll('.audio-trigger');
                 handlePlay(element);
            if (elements.length === 0) {
                 // 不调用 event.stopPropagation() 或 event.preventDefault()
                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:双重初始化
            // 同时绑定touch和click(passive模式提升移动端性能)
        if (document.readyState === 'complete') {
            element.addEventListener('touchstart', handler, { passive: true });
            alert("⚡ 立即初始化已有内容");
             element.addEventListener('click', handler);
            bindAudioEvents();
        } else {
            alert("⏳ 等待DOM加载完成");
             document.addEventListener('DOMContentLoaded', bindAudioEvents);
        }
       
        // 动态内容监听
        mw.hook('wikipage.content').add(function() {
            alert("🔄 检测到新内容加载");
            bindAudioEvents();
         });
         });
    }


     }, function(error) {
     // 页面加载时初始化
        alert(`🚨 依赖加载失败:${error}`);
    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);
})();