打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

Widget:GF立绘切换:修订间差异

来自OGAS数据中枢
弃权者留言 | 贡献
无编辑摘要
弃权者留言 | 贡献
无编辑摘要
 
(未显示同一用户的16个中间版本)
第1行: 第1行:
<includeonly><script>
<script>
(function() {
(function () {
     function initSwitcher() {
     function initSwitcher() {
         document.querySelectorAll('.gf-infobox-new').forEach(function(box) {
        var api = (window.mw && mw.Api) ? new mw.Api() : null;
             if (box.dataset.switcherReady) return;
         document.querySelectorAll('.gf-infobox-new').forEach(function (box) {
             box.dataset.switcherReady = 'true';
             if (box.dataset.ready) return;
           
             box.dataset.ready = '1';
 
             var container = box.querySelector('.gf-image-container');
             var container = box.querySelector('.gf-image-container');
             var thumbItems = box.querySelectorAll('.gf-thumb-item');
             var btns = box.querySelectorAll('.gf-switch-btn');
              
             var overlay = box.querySelector('.gf-switcher-overlay');
            if (!container || thumbItems.length < 2) return;
             var toggle = box.querySelector('.gf-switcher-toggle');
              
            var viewBtn = box.querySelector('.gf-view-original');
            // 直接从缩略图中提取完整的大图URL
 
            function extractFullImageUrl(thumbItem) {
            if (toggle) toggle.onclick = function() { overlay.classList.toggle('collapsed'); };
                var img = thumbItem.querySelector('img');
 
                if (!img) return null;
            function getImgPath(filename, currentSrc, callback) {
               
                 if (api) {
                var src = img.src;
                    api.get({ action: 'query', prop: 'imageinfo', titles: 'File:' + filename, iiprop: 'url' })
                // MediaWiki缩略图URL格式:
                    .done(function (data) {
                // /images/thumb/a/ab/Filename.jpg/60px-Filename.jpg
                        var pages = data.query.pages;
                 // 需要转换为:
                        for (var id in pages) { if (pages[id].imageinfo) { callback(pages[id].imageinfo[0].url); return; } }
                // /images/a/ab/Filename.jpg
                        tryFallback();
               
                    }).fail(tryFallback);
                // 方法1: 移除 /thumb/ 和 /尺寸px-文件名 部分
                 } else tryFallback();
                var url = src.replace('/thumb/', '/');
 
                // 移除最后的 /数字px-文件名 部分
                 function tryFallback() {
                url = url.replace(/\/\d+px-[^\/]+$/, '');
                    if (!currentSrc) { callback(null); return; }
                 // 重新添加文件名
                    var curName = currentSrc.substring(currentSrc.lastIndexOf('/') + 1);
                 var filename = src.split('/').pop().replace(/^\d+px-/, '');
                    callback(currentSrc.replace(curName, filename.replace(/ /g, '_')));
                 url = url + '/' + filename;
                 }
               
                return url;
             }
             }
           
 
             thumbItems.forEach(function(item) {
             if (viewBtn) {
                 item.addEventListener('click', function(e) {
                 viewBtn.onclick = function(e) {
                    e.preventDefault();
                     e.stopPropagation();
                     e.stopPropagation();
                      
                     var activeBtn = box.querySelector('.gf-switch-btn.active');
                    if (this.classList.contains('active')) return;
                     if (activeBtn) {
                      
                        var filename = activeBtn.dataset.filename;
                    var newImgUrl = extractFullImageUrl(this);
                        var isDmg = activeBtn.dataset.state === 'damage';
                    if (!newImgUrl) {
                        var target = isDmg ? filename.substring(0, filename.lastIndexOf('.')) + '_D' + filename.substring(filename.lastIndexOf('.')) : filename;
                        console.warn('Cannot extract image URL');
                         window.open(mw.config.get('wgArticlePath').replace('$1', 'File:' + target), '_blank');
                         return;
                     }
                     }
                   
                };
                    // 保存容器当前内容
            }
                    var currentHTML = container.innerHTML;
 
                   
            container.onclick = function() {
                     // 尝试加载新图片
                var img = container.querySelector('img');
                    var testImg = new Image();
                var activeBtn = box.querySelector('.gf-switch-btn.active');
                    testImg.onload = function() {
                if (!img || !activeBtn) return;
                         // 创建新图片并设置样式
                var base = activeBtn.dataset.filename;
                         var newImgHTML = '<img src="' + newImgUrl + '" style="max-width:100%;max-height:420px;object-fit:contain;opacity:1;transition:opacity 0.3s ease;">';
                var isDmg = activeBtn.dataset.state === 'damage';
                       
                var target = isDmg ? base : base.substring(0, base.lastIndexOf('.')) + '_D' + base.substring(base.lastIndexOf('.'));
                        // 淡出效果
               
                        var oldImg = container.querySelector('img');
                container.classList.add('loading');
                        if (oldImg) {
                getImgPath(target, img.src, function(url) {
                            oldImg.style.opacity = '0';
                     if (url) {
                            oldImg.style.transition = 'opacity 0.15s ease';
                        var t = new Image();
                        t.onload = function() {  
                            img.src = url;
                            activeBtn.dataset.state = isDmg ? 'normal' : 'damage';
                            container.classList.remove('loading');
                        };
                         t.onerror = function() { container.classList.remove('loading'); };
                         t.src = url;
                    } else container.classList.remove('loading');
                });
            };
 
            btns.forEach(function (btn) {
                btn.onclick = function (e) {
                    e.stopPropagation();
                    if (btn.classList.contains('active')) return;
                    var filename = btn.dataset.filename;
                    btn.dataset.state = 'normal';
                    var oldImg = container.querySelector('img');
                    if (oldImg) oldImg.style.opacity = '0';
                    getImgPath(filename, (oldImg ? oldImg.src : null), function(url) {
                        if (url) {
                            setTimeout(function () {
                                container.innerHTML = '<div class="gf-main-img"><img src="' + url + '" style="opacity:0;"></div>';
                                container.appendChild(viewBtn);
                                var n = container.querySelector('img');
                                n.onload = function () { n.style.opacity = '1'; };
                                if (n.complete) n.style.opacity = '1';
                            }, 150);
                         }
                         }
                       
                    });
                        // 延迟替换
                    btns.forEach(function (b) { b.classList.remove('active'); });
                        setTimeout(function() {
                    btn.classList.add('active');
                            container.innerHTML = newImgHTML;
                 };
                            var newImg = container.querySelector('img');
                            if (newImg) {
                                newImg.style.opacity = '0';
                                requestAnimationFrame(function() {
                                    newImg.style.opacity = '1';
                                });
                            }
                        }, 150);
                       
                        // 更新激活状态
                        thumbItems.forEach(function(t) { t.classList.remove('active'); });
                        item.classList.add('active');
                    };
                   
                    testImg.onerror = function() {
                        console.error('Cannot load: ' + newImgUrl);
                        // 尝试备用URL
                        var altUrl = newImgUrl.replace(/\/images\//, '/images/thumb/') + '/280px-' + newImgUrl.split('/').pop();
                        testImg.src = altUrl;
                    };
                   
                    testImg.src = newImgUrl;
                 });
             });
             });
         });
         });
     }
     }
      
 
     if (document.readyState === 'loading') {
     var r = 0;
         document.addEventListener('DOMContentLoaded', initSwitcher);
     var c = setInterval(function() {
    } else {
         r++;
         initSwitcher();
         if (window.mw && mw.Api && mw.loader && mw.loader.using) {
    }
            clearInterval(c);
   
            mw.loader.using(['mediawiki.api']).then(initSwitcher);
    if (window.mw && mw.hook) {
        } else if (r > 60) { clearInterval(c); if (window.jQuery) initSwitcher(); }
        mw.hook('wikipage.content').add(initSwitcher);
     }, 100);
     }
})();
})();
</script></includeonly>
</script>

2026年5月16日 (六) 00:30的最新版本

<script> (function () {

   function initSwitcher() {
       var api = (window.mw && mw.Api) ? new mw.Api() : null;
       document.querySelectorAll('.gf-infobox-new').forEach(function (box) {
           if (box.dataset.ready) return;
           box.dataset.ready = '1';
           var container = box.querySelector('.gf-image-container');
           var btns = box.querySelectorAll('.gf-switch-btn');
           var overlay = box.querySelector('.gf-switcher-overlay');
           var toggle = box.querySelector('.gf-switcher-toggle');
           var viewBtn = box.querySelector('.gf-view-original');
           if (toggle) toggle.onclick = function() { overlay.classList.toggle('collapsed'); };
           function getImgPath(filename, currentSrc, callback) {
               if (api) {
                   api.get({ action: 'query', prop: 'imageinfo', titles: 'File:' + filename, iiprop: 'url' })
                   .done(function (data) {
                       var pages = data.query.pages;
                       for (var id in pages) { if (pages[id].imageinfo) { callback(pages[id].imageinfo[0].url); return; } }
                       tryFallback();
                   }).fail(tryFallback);
               } else tryFallback();
               function tryFallback() {
                   if (!currentSrc) { callback(null); return; }
                   var curName = currentSrc.substring(currentSrc.lastIndexOf('/') + 1);
                   callback(currentSrc.replace(curName, filename.replace(/ /g, '_')));
               }
           }
           if (viewBtn) {
               viewBtn.onclick = function(e) {
                   e.stopPropagation();
                   var activeBtn = box.querySelector('.gf-switch-btn.active');
                   if (activeBtn) {
                       var filename = activeBtn.dataset.filename;
                       var isDmg = activeBtn.dataset.state === 'damage';
                       var target = isDmg ? filename.substring(0, filename.lastIndexOf('.')) + '_D' + filename.substring(filename.lastIndexOf('.')) : filename;
                       window.open(mw.config.get('wgArticlePath').replace('$1', 'File:' + target), '_blank');
                   }
               };
           }
           container.onclick = function() {
               var img = container.querySelector('img');
               var activeBtn = box.querySelector('.gf-switch-btn.active');
               if (!img || !activeBtn) return;
               var base = activeBtn.dataset.filename;
               var isDmg = activeBtn.dataset.state === 'damage';
               var target = isDmg ? base : base.substring(0, base.lastIndexOf('.')) + '_D' + base.substring(base.lastIndexOf('.'));
               
               container.classList.add('loading');
               getImgPath(target, img.src, function(url) {
                   if (url) {
                       var t = new Image();
                       t.onload = function() { 
                           img.src = url; 
                           activeBtn.dataset.state = isDmg ? 'normal' : 'damage'; 
                           container.classList.remove('loading'); 
                       };
                       t.onerror = function() { container.classList.remove('loading'); };
                       t.src = url;
                   } else container.classList.remove('loading');
               });
           };
           btns.forEach(function (btn) {
               btn.onclick = function (e) {
                   e.stopPropagation();
                   if (btn.classList.contains('active')) return;
                   var filename = btn.dataset.filename;
                   btn.dataset.state = 'normal';
                   var oldImg = container.querySelector('img');
                   if (oldImg) oldImg.style.opacity = '0';
                   getImgPath(filename, (oldImg ? oldImg.src : null), function(url) {
                       if (url) {
                           setTimeout(function () {

container.innerHTML = '

<img src="' + url + '" style="opacity:0;">

';

                               container.appendChild(viewBtn);
                               var n = container.querySelector('img');
                               n.onload = function () { n.style.opacity = '1'; };
                               if (n.complete) n.style.opacity = '1';
                           }, 150);
                       }
                   });
                   btns.forEach(function (b) { b.classList.remove('active'); });
                   btn.classList.add('active');
               };
           });
       });
   }
   var r = 0;
   var c = setInterval(function() {
       r++;
       if (window.mw && mw.Api && mw.loader && mw.loader.using) {
           clearInterval(c);
           mw.loader.using(['mediawiki.api']).then(initSwitcher);
       } else if (r > 60) { clearInterval(c); if (window.jQuery) initSwitcher(); }
   }, 100);

})(); </script>