MediaWiki

Gadget-TierListMaker.js:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
创建页面,内容为“* * 战斗员图鉴分级表制作工具 * 支持拖放卡片到表格并导出为PNG:​ (function() { 'use strict'; // 仅在特定页面启用 if (mw.config.get('wgPageName') !== '节奏榜') { return; } // 等待页面加载完成 mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() { init(); }); function init() { // 添加控制按钮 addControlPanel();…”
 
律Rhyme留言 | 贡献
无编辑摘要
 
(未显示同一用户的1个中间版本)
第1行: 第1行:
/**
// MediaWiki:Gadget-TierListMaker.js
* 战斗员图鉴分级表制作工具
 
* 支持拖放卡片到表格并导出为PNG
*/
(function() {
(function() {
     'use strict';
     'use strict';
 
   
     // 仅在特定页面启用
     // 仅在 TierListMaker 页面运行
     if (mw.config.get('wgPageName') !== '节奏榜') {
     if (mw.config.get('wgPageName') !== '节奏榜') {
         return;
         return;
     }
     }
 
   
     // 等待页面加载完成
     // 等待页面加载完成
     mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() {
     $(function() {
         init();
         initTierListMaker();
     });
     });
 
   
     function init() {
     function initTierListMaker() {
         // 添加控制按钮
         // 添加控制按钮
         addControlPanel();
         addControlButtons();
       
        // 使卡片可拖动
        makeCardsDraggable();
          
          
         // 使表格单元格可接收
         // 初始化拖拽功能
         makeTableDroppable();
         initDragAndDrop();
          
          
         // 添加样式
         // 添加样式
         addStyles();
         addCustomStyles();
     }
     }
 
   
     function addControlPanel() {
     function addControlButtons() {
         var $panel = $('<div>')
         var $buttonContainer = $('<div>')
             .attr('id', 'tierlist-control-panel')
             .attr('id', 'tier-list-controls')
             .css({
             .css({
                 'position': 'fixed',
                 'margin': '10px 0',
                 'top': '100px',
                 'padding': '10px',
                'right': '20px',
                 'background': '#f0f0f0',
                'z-index': '9999',
                 'border-radius': '5px'
                 'background': '#fff',
                'border': '2px solid #0645ad',
                 'border-radius': '8px',
                'padding': '15px',
                'box-shadow': '0 4px 6px rgba(0,0,0,0.1)',
                'min-width': '200px'
             });
             });
 
       
         var $title = $('<h3>')
         var $saveButton = $('<button>')
             .text('分级表工具')
             .text('保存为PNG')
             .css({
             .addClass('tier-list-save-btn')
                'margin': '0 0 10px 0',
            .click(saveTierListAsPNG);
                'font-size': '16px',
       
                'color': '#0645ad'
        var $clearButton = $('<button>')
            .text('清空所有')
            .addClass('tier-list-clear-btn')
            .click(clearAllTiers);
       
        var $resetButton = $('<button>')
            .text('重置')
            .addClass('tier-list-reset-btn')
            .click(function() {
                location.reload();
             });
             });
 
       
         var $exportBtn = $('<button>')
         $buttonContainer.append($saveButton, ' ', $clearButton, ' ', $resetButton);
            .text('📸 导出为PNG')
        $('.wikitable').before($buttonContainer);
            .css({
    }
                 'width': '100%',
   
                'padding': '10px',
    function addCustomStyles() {
                'margin': '5px 0',
        var styles = `
                'background': '#0645ad',
            <style>
                'color': '#fff',
                 .tier-list-save-btn, .tier-list-clear-btn, .tier-list-reset-btn {
                'border': 'none',
                    padding: 8px 16px;
                'border-radius': '4px',
                    margin: 0 5px;
                'cursor': 'pointer',
                    font-size: 14px;
                 'font-size': '14px'
                    font-weight: bold;
            })
                    border: none;
            .hover(
                    border-radius: 4px;
                 function() { $(this).css('background', '#0b5394'); },
                    cursor: pointer;
                 function() { $(this).css('background', '#0645ad'); }
                    transition: all 0.3s;
            )
                }
            .click(exportToPNG);
               
 
                 .tier-list-save-btn {
        var $clearBtn = $('<button>')
                    background: #4CAF50;
            .text('🗑️ 清空表格')
                    color: white;
            .css({
                }
                'width': '100%',
               
                'padding': '10px',
                .tier-list-save-btn:hover {
                 'margin': '5px 0',
                    background: #45a049;
                 'background': '#d33',
                }
                'color': '#fff',
               
                 'border': 'none',
                 .tier-list-clear-btn {
                 'border-radius': '4px',
                    background: #f44336;
                'cursor': 'pointer',
                    color: white;
                'font-size': '14px'
                }
            })
                  
            .hover(
                .tier-list-clear-btn:hover {
                function() { $(this).css('background', '#a00'); },
                    background: #da190b;
                 function() { $(this).css('background', '#d33'); }
                }
            )
               
            .click(clearTable);
                .tier-list-reset-btn {
 
                    background: #2196F3;
        var $toggleBtn = $('<button>')
                    color: white;
            .text('👁️ 切换编辑模式')
                }
            .attr('id', 'toggle-edit-mode')
               
            .css({
                .tier-list-reset-btn:hover {
                'width': '100%',
                    background: #0b7dda;
                'padding': '10px',
                }
                'margin': '5px 0',
               
                'background': '#36c',
                .wikitable td {
                 'color': '#fff',
                    min-height: 120px;
                 'border': 'none',
                    min-width: 300px;
                 'border-radius': '4px',
                    padding: 10px;
                'cursor': 'pointer',
                    vertical-align: top;
                'font-size': '14px'
                    position: relative;
            })
                }
             .hover(
               
                function() { $(this).css('background', '#258'); },
                 .tier-row-drop-zone {
                function() { $(this).css('background', '#36c'); }
                    border: 2px dashed transparent;
            )
                    transition: all 0.3s;
             .click(toggleEditMode);
                }
 
               
         var $info = $('<div>')
                 .tier-row-drop-zone.drag-over {
             .css({
                    border-color: #2196F3;
                'margin-top': '10px',
                    background-color: rgba(33, 150, 243, 0.1);
                'padding': '10px',
                }
                'background': '#f8f9fa',
                  
                'border-radius': '4px',
                 .avatar-frame {
                'font-size': '12px',
                    cursor: move;
                'color': '#666'
                    transition: transform 0.2s, opacity 0.2s;
             })
                    user-select: none;
            .html('<strong>使用说明:</strong><br>1. 拖动卡片到表格<br>2. 右键点击可删除<br>3. 导出前切换预览');
                }
 
               
         $panel.append($title, $exportBtn, $clearBtn, $toggleBtn, $info);
                .avatar-frame:hover {
         $('body').append($panel);
                    transform: scale(1.05);
                }
                  
                .avatar-frame.dragging {
                    opacity: 0.5;
                }
               
                .avatar-frame.in-tier {
                    margin: 5px;
                }
               
                #avatar-pool {
                    border: 2px solid #ddd;
                    padding: 10px;
                    margin: 10px 0;
                    border-radius: 5px;
                    background: #fafafa;
                    min-height: 150px;
                 }
                  
                 #avatar-pool-title {
                    font-size: 16px;
                    font-weight: bold;
                    margin-bottom: 10px;
                    color: #333;
                }
             </style>
        `;
        $('head').append(styles);
    }
   
    function initDragAndDrop() {
        // 创建头像池容器
        var $avatarPool = $('<div>')
            .attr('id', 'avatar-pool')
             .addClass('tier-row-drop-zone');
       
         var $poolTitle = $('<div>')
             .attr('id', 'avatar-pool-title')
            .text('角色池(拖动到上方表格)');
       
        $avatarPool.append($poolTitle);
       
        // 将所有头像移动到头像池
        var $avatars = $('.avatar-frame');
        $avatars.each(function() {
             $(this).addClass('avatar-item').appendTo($avatarPool);
        });
       
         $('.wikitable').after($avatarPool);
       
        // 为表格单元格添加drop-zone类
         $('.wikitable td').addClass('tier-row-drop-zone');
       
        // 初始化所有头像的拖拽
        initAvatarDrag();
       
        // 初始化所有drop zone
        initDropZones();
     }
     }
 
   
     function makeCardsDraggable() {
     function initAvatarDrag() {
         $('.战斗员卡片').each(function() {
         $('.avatar-frame').each(function() {
             var $card = $(this);
             var $avatar = $(this);
           
            $avatar.attr('draggable', 'true');
           
            $avatar.on('dragstart', function(e) {
                $(this).addClass('dragging');
                e.originalEvent.dataTransfer.effectAllowed = 'move';
                e.originalEvent.dataTransfer.setData('text/html', this.outerHTML);
            });
              
              
             $card.attr('draggable', 'true')
             $avatar.on('dragend', function(e) {
                .css('cursor', 'move')
                $(this).removeClass('dragging');
                .on('dragstart', function(e) {
            });
                    var cardHTML = $card[0].outerHTML;
                    e.originalEvent.dataTransfer.setData('text/html', cardHTML);
                    e.originalEvent.dataTransfer.effectAllowed = 'copy';
                    $card.css('opacity', '0.5');
                })
                .on('dragend', function() {
                    $card.css('opacity', '1');
                });
         });
         });
     }
     }
 
   
     function makeTableDroppable() {
     function initDropZones() {
         $('.wikitable td').each(function() {
         $('.tier-row-drop-zone').each(function() {
             var $cell = $(this);
             var $zone = $(this);
           
            $zone.on('dragover', function(e) {
                e.preventDefault();
                e.originalEvent.dataTransfer.dropEffect = 'move';
                $(this).addClass('drag-over');
            });
           
            $zone.on('dragleave', function(e) {
                $(this).removeClass('drag-over');
            });
              
              
             $cell.addClass('tierlist-dropzone')
             $zone.on('drop', function(e) {
                .css({
                e.preventDefault();
                    'min-height': '280px',
                $(this).removeClass('drag-over');
                    'vertical-align': 'top',
                  
                    'padding': '10px',
                 var $dragging = $('.avatar-frame.dragging');
                    'position': 'relative'
                  
                })
                 if ($dragging.length) {
                .on('dragover', function(e) {
                     // 移动现有元素
                    e.preventDefault();
                     $dragging.removeClass('dragging');
                    e.originalEvent.dataTransfer.dropEffect = 'copy';
                    $cell.addClass('drag-over');
                 })
                 .on('dragleave', function() {
                    $cell.removeClass('drag-over');
                 })
                 .on('drop', function(e) {
                     e.preventDefault();
                     $cell.removeClass('drag-over');
                      
                      
                     var cardHTML = e.originalEvent.dataTransfer.getData('text/html');
                     // 如果是在tier中,添加样式
                     if (cardHTML) {
                     if ($(this).hasClass('wikitable')) {
                        var $newCard = $(cardHTML);
                        $dragging.addClass('in-tier');
                        $newCard.addClass('placed-card')
                    } else if ($(this).attr('id') === 'avatar-pool') {
                            .css('margin', '5px')
                        $dragging.removeClass('in-tier');
                            .on('contextmenu', function(e) {
                    } else {
                                e.preventDefault();
                         $dragging.addClass('in-tier');
                                if (confirm('确定要删除这张卡片吗?')) {
                                    $newCard.remove();
                                }
                            })
                            .on('dblclick', function() {
                                if (confirm('确定要删除这张卡片吗?')) {
                                    $newCard.remove();
                                }
                            });
                       
                         $cell.append($newCard);
                        makeCardsDraggable(); // 重新启用新卡片的拖动
                     }
                     }
                 });
                   
                    $(this).append($dragging);
                 }
            });
         });
         });
     }
     }
 
   
     function toggleEditMode() {
     function clearAllTiers() {
         $('body').toggleClass('tierlist-preview-mode');
         if (!confirm('确定要清空所有分级吗?')) {
        var isPreview = $('body').hasClass('tierlist-preview-mode');
            return;
         $('#toggle-edit-mode').text(isPreview ? '✏️ 切换编辑模式' : '👁️ 切换预览模式');
         }
          
          
         if (isPreview) {
         // 将所有tier中的头像移回头像池
             $('.placed-card').css('pointer-events', 'none');
        $('.wikitable td .avatar-frame').each(function() {
             $('#tierlist-control-panel').fadeOut();
             $(this).removeClass('in-tier');
             $('#avatar-pool').append($(this));
        });
    }
   
    function saveTierListAsPNG() {
        // 检查是否已加载html2canvas库
        if (typeof html2canvas === 'undefined') {
            loadHtml2Canvas(function() {
                captureTierList();
            });
         } else {
         } else {
             $('.placed-card').css('pointer-events', 'auto');
             captureTierList();
            $('#tierlist-control-panel').fadeIn();
         }
         }
     }
     }
 
   
     function clearTable() {
     function loadHtml2Canvas(callback) {
         if (confirm('确定要清空表格中的所有卡片吗?此操作不可撤销!')) {
         mw.loader.using('jquery', function() {
             $('.wikitable .placed-card').remove();
             $.getScript('https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js')
         }
                .done(function() {
                    callback();
                })
                .fail(function() {
                    alert('加载截图库失败,请检查网络连接');
                });
         });
     }
     }
 
   
     function exportToPNG() {
     function captureTierList() {
         var $btn = $('#tierlist-control-panel button').eq(0);
         var $table = $('.wikitable');
        $btn.prop('disabled', true).text('正在生成...');
          
 
         if ($table.length === 0) {
         // 加载 html2canvas 库
             alert('未找到表格');
         if (typeof html2canvas === 'undefined') {
             return;
             mw.loader.load('https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js', 'text/javascript');
              
            var checkLoaded = setInterval(function() {
                if (typeof html2canvas !== 'undefined') {
                    clearInterval(checkLoaded);
                    performExport($btn);
                }
            }, 100);
        } else {
            performExport($btn);
         }
         }
    }
    function performExport($btn) {
        var $table = $('.wikitable').first();
          
          
         // 临时隐藏控制面板
         // 显示加载提示
         var $panel = $('#tierlist-control-panel');
         var $loading = $('<div>')
        $panel.hide();
            .css({
                'position': 'fixed',
                'top': '50%',
                'left': '50%',
                'transform': 'translate(-50%, -50%)',
                'background': 'rgba(0,0,0,0.8)',
                'color': 'white',
                'padding': '20px 40px',
                'border-radius': '10px',
                'z-index': 9999,
                'font-size': '18px'
            })
            .text('正在生成图片...')
            .appendTo('body');
          
          
        // 进入预览模式
        var wasPreview = $('body').hasClass('tierlist-preview-mode');
        if (!wasPreview) {
            $('body').addClass('tierlist-preview-mode');
        }
         html2canvas($table[0], {
         html2canvas($table[0], {
             backgroundColor: '#ffffff',
             backgroundColor: '#ffffff',
第251行: 第307行:
             allowTaint: true
             allowTaint: true
         }).then(function(canvas) {
         }).then(function(canvas) {
            // 恢复界面
             $loading.remove();
             $panel.show();
            if (!wasPreview) {
                $('body').removeClass('tierlist-preview-mode');
            }
              
              
             // 下载图片
             // 转换为blob并下载
             var link = document.createElement('a');
             canvas.toBlob(function(blob) {
            var timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-');
                var url = URL.createObjectURL(blob);
            link.download = '战斗员分级表_' + timestamp + '.png';
                var link = document.createElement('a');
            link.href = canvas.toDataURL('image/png');
                var timestamp = new Date().toISOString().slice(0,19).replace(/:/g,'-');
            link.click();
                link.download = 'tier-list-' + timestamp + '.png';
           
                link.href = url;
            $btn.prop('disabled', false).text('📸 导出为PNG');
                link.click();
              
                URL.revokeObjectURL(url);
            mw.notify('分级表已成功导出!', { type: 'success' });
             });
         }).catch(function(error) {
         }).catch(function(error) {
            console.error('导出失败:', error);
             $loading.remove();
             $panel.show();
             console.error('截图失败:', error);
             $btn.prop('disabled', false).text('📸 导出为PNG');
             alert('生成图片失败,请重试');
             mw.notify('导出失败,请查看控制台了解详情', { type: 'error' });
         });
         });
     }
     }
 
      
     function addStyles() {
        var styles = `
            .tierlist-dropzone {
                transition: background-color 0.3s;
            }
           
            .tierlist-dropzone.drag-over {
                background-color: #e6f3ff !important;
                border: 2px dashed #0645ad !important;
            }
           
            .placed-card {
                transition: transform 0.2s, box-shadow 0.2s;
            }
           
            .placed-card:hover {
                transform: scale(1.05);
                box-shadow: 0 4px 8px rgba(0,0,0,0.2);
                z-index: 10;
            }
           
            .tierlist-preview-mode .placed-card {
                pointer-events: none;
            }
           
            .tierlist-preview-mode .placed-card:hover {
                transform: none;
                box-shadow: none;
            }
           
            @media print {
                #tierlist-control-panel {
                    display: none !important;
                }
            }
        `;
       
        $('<style>').text(styles).appendTo('head');
    }
 
})();
})();

2025年10月6日 (一) 19:39的最新版本

// MediaWiki:Gadget-TierListMaker.js

(function() {
    'use strict';
    
    // 仅在 TierListMaker 页面运行
    if (mw.config.get('wgPageName') !== '节奏榜') {
        return;
    }
    
    // 等待页面加载完成
    $(function() {
        initTierListMaker();
    });
    
    function initTierListMaker() {
        // 添加控制按钮
        addControlButtons();
        
        // 初始化拖拽功能
        initDragAndDrop();
        
        // 添加样式
        addCustomStyles();
    }
    
    function addControlButtons() {
        var $buttonContainer = $('<div>')
            .attr('id', 'tier-list-controls')
            .css({
                'margin': '10px 0',
                'padding': '10px',
                'background': '#f0f0f0',
                'border-radius': '5px'
            });
        
        var $saveButton = $('<button>')
            .text('保存为PNG')
            .addClass('tier-list-save-btn')
            .click(saveTierListAsPNG);
        
        var $clearButton = $('<button>')
            .text('清空所有')
            .addClass('tier-list-clear-btn')
            .click(clearAllTiers);
        
        var $resetButton = $('<button>')
            .text('重置')
            .addClass('tier-list-reset-btn')
            .click(function() {
                location.reload();
            });
        
        $buttonContainer.append($saveButton, ' ', $clearButton, ' ', $resetButton);
        $('.wikitable').before($buttonContainer);
    }
    
    function addCustomStyles() {
        var styles = `
            <style>
                .tier-list-save-btn, .tier-list-clear-btn, .tier-list-reset-btn {
                    padding: 8px 16px;
                    margin: 0 5px;
                    font-size: 14px;
                    font-weight: bold;
                    border: none;
                    border-radius: 4px;
                    cursor: pointer;
                    transition: all 0.3s;
                }
                
                .tier-list-save-btn {
                    background: #4CAF50;
                    color: white;
                }
                
                .tier-list-save-btn:hover {
                    background: #45a049;
                }
                
                .tier-list-clear-btn {
                    background: #f44336;
                    color: white;
                }
                
                .tier-list-clear-btn:hover {
                    background: #da190b;
                }
                
                .tier-list-reset-btn {
                    background: #2196F3;
                    color: white;
                }
                
                .tier-list-reset-btn:hover {
                    background: #0b7dda;
                }
                
                .wikitable td {
                    min-height: 120px;
                    min-width: 300px;
                    padding: 10px;
                    vertical-align: top;
                    position: relative;
                }
                
                .tier-row-drop-zone {
                    border: 2px dashed transparent;
                    transition: all 0.3s;
                }
                
                .tier-row-drop-zone.drag-over {
                    border-color: #2196F3;
                    background-color: rgba(33, 150, 243, 0.1);
                }
                
                .avatar-frame {
                    cursor: move;
                    transition: transform 0.2s, opacity 0.2s;
                    user-select: none;
                }
                
                .avatar-frame:hover {
                    transform: scale(1.05);
                }
                
                .avatar-frame.dragging {
                    opacity: 0.5;
                }
                
                .avatar-frame.in-tier {
                    margin: 5px;
                }
                
                #avatar-pool {
                    border: 2px solid #ddd;
                    padding: 10px;
                    margin: 10px 0;
                    border-radius: 5px;
                    background: #fafafa;
                    min-height: 150px;
                }
                
                #avatar-pool-title {
                    font-size: 16px;
                    font-weight: bold;
                    margin-bottom: 10px;
                    color: #333;
                }
            </style>
        `;
        $('head').append(styles);
    }
    
    function initDragAndDrop() {
        // 创建头像池容器
        var $avatarPool = $('<div>')
            .attr('id', 'avatar-pool')
            .addClass('tier-row-drop-zone');
        
        var $poolTitle = $('<div>')
            .attr('id', 'avatar-pool-title')
            .text('角色池(拖动到上方表格)');
        
        $avatarPool.append($poolTitle);
        
        // 将所有头像移动到头像池
        var $avatars = $('.avatar-frame');
        $avatars.each(function() {
            $(this).addClass('avatar-item').appendTo($avatarPool);
        });
        
        $('.wikitable').after($avatarPool);
        
        // 为表格单元格添加drop-zone类
        $('.wikitable td').addClass('tier-row-drop-zone');
        
        // 初始化所有头像的拖拽
        initAvatarDrag();
        
        // 初始化所有drop zone
        initDropZones();
    }
    
    function initAvatarDrag() {
        $('.avatar-frame').each(function() {
            var $avatar = $(this);
            
            $avatar.attr('draggable', 'true');
            
            $avatar.on('dragstart', function(e) {
                $(this).addClass('dragging');
                e.originalEvent.dataTransfer.effectAllowed = 'move';
                e.originalEvent.dataTransfer.setData('text/html', this.outerHTML);
            });
            
            $avatar.on('dragend', function(e) {
                $(this).removeClass('dragging');
            });
        });
    }
    
    function initDropZones() {
        $('.tier-row-drop-zone').each(function() {
            var $zone = $(this);
            
            $zone.on('dragover', function(e) {
                e.preventDefault();
                e.originalEvent.dataTransfer.dropEffect = 'move';
                $(this).addClass('drag-over');
            });
            
            $zone.on('dragleave', function(e) {
                $(this).removeClass('drag-over');
            });
            
            $zone.on('drop', function(e) {
                e.preventDefault();
                $(this).removeClass('drag-over');
                
                var $dragging = $('.avatar-frame.dragging');
                
                if ($dragging.length) {
                    // 移动现有元素
                    $dragging.removeClass('dragging');
                    
                    // 如果是在tier中,添加样式
                    if ($(this).hasClass('wikitable')) {
                        $dragging.addClass('in-tier');
                    } else if ($(this).attr('id') === 'avatar-pool') {
                        $dragging.removeClass('in-tier');
                    } else {
                        $dragging.addClass('in-tier');
                    }
                    
                    $(this).append($dragging);
                }
            });
        });
    }
    
    function clearAllTiers() {
        if (!confirm('确定要清空所有分级吗?')) {
            return;
        }
        
        // 将所有tier中的头像移回头像池
        $('.wikitable td .avatar-frame').each(function() {
            $(this).removeClass('in-tier');
            $('#avatar-pool').append($(this));
        });
    }
    
    function saveTierListAsPNG() {
        // 检查是否已加载html2canvas库
        if (typeof html2canvas === 'undefined') {
            loadHtml2Canvas(function() {
                captureTierList();
            });
        } else {
            captureTierList();
        }
    }
    
    function loadHtml2Canvas(callback) {
        mw.loader.using('jquery', function() {
            $.getScript('https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js')
                .done(function() {
                    callback();
                })
                .fail(function() {
                    alert('加载截图库失败,请检查网络连接');
                });
        });
    }
    
    function captureTierList() {
        var $table = $('.wikitable');
        
        if ($table.length === 0) {
            alert('未找到表格');
            return;
        }
        
        // 显示加载提示
        var $loading = $('<div>')
            .css({
                'position': 'fixed',
                'top': '50%',
                'left': '50%',
                'transform': 'translate(-50%, -50%)',
                'background': 'rgba(0,0,0,0.8)',
                'color': 'white',
                'padding': '20px 40px',
                'border-radius': '10px',
                'z-index': 9999,
                'font-size': '18px'
            })
            .text('正在生成图片...')
            .appendTo('body');
        
        html2canvas($table[0], {
            backgroundColor: '#ffffff',
            scale: 2,
            logging: false,
            useCORS: true,
            allowTaint: true
        }).then(function(canvas) {
            $loading.remove();
            
            // 转换为blob并下载
            canvas.toBlob(function(blob) {
                var url = URL.createObjectURL(blob);
                var link = document.createElement('a');
                var timestamp = new Date().toISOString().slice(0,19).replace(/:/g,'-');
                link.download = 'tier-list-' + timestamp + '.png';
                link.href = url;
                link.click();
                URL.revokeObjectURL(url);
            });
        }).catch(function(error) {
            $loading.remove();
            console.error('截图失败:', error);
            alert('生成图片失败,请重试');
        });
    }
    
})();