MediaWiki:Common.js:修订间差异

来自勿忘草与永远的少女
跳到导航跳到搜索
Admin留言 | 贡献
无编辑摘要
标签已被回退
Admin留言 | 贡献
无编辑摘要
 
(未显示同一用户的22个中间版本)
第1行: 第1行:
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
$(function() {
$(function() {
     // ==================== 1. 固定顶部导航栏 ====================
     // 检查是否已存在导航栏,避免重复添加
     if ($('.fixed-top-nav').length === 0) {
     if ($('.fixed-top-nav').length === 0) {
       
        // 导航栏 HTML 结构
         var navHtml = `
         var navHtml = `
             <div class="fixed-top-nav">
             <div class="fixed-top-nav">
第25行: 第26行:
                     <a href="装备图鉴" class="nav-link">
                     <a href="装备图鉴" class="nav-link">
                         📊 装备图鉴
                         📊 装备图鉴
                    </a>
                    <a href="兑换中心" class="nav-link">
                        📊 兑换中心
                    </a>
                    <a href="羁绊详情" class="nav-link">
                        📊 羁绊详情
                     </a>
                     </a>
                     <a href="https://www.war3whj.top/war3wiki/moniqi/moniqi.html" class="nav-link">
                     <a href="https://www.war3whj.top/war3wiki/moniqi/moniqi.html" class="nav-link">
第32行: 第39行:
             </div>
             </div>
         `;
         `;
       
        // 将导航栏插入到 body 开头
         $('body').prepend(navHtml);
         $('body').prepend(navHtml);
          
          
        // 滚动时添加效果(可选)
         $(window).scroll(function() {
         $(window).scroll(function() {
             if ($(window).scrollTop() > 50) {
             if ($(window).scrollTop() > 50) {
第42行: 第52行:
         });
         });
     }
     }
});


     // ==================== 2. 页脚固定处理 ====================
 
$(function() {
     // 确保页脚固定在底部
     var footer = $('#footer, .mw-footer');
     var footer = $('#footer, .mw-footer');
   
     if (footer.length > 0) {
     if (footer.length > 0) {
        // 设置底部内边距避免内容被遮挡
         var footerHeight = footer.outerHeight();
         var footerHeight = footer.outerHeight();
         $('body').css('padding-bottom', footerHeight + 20 + 'px');
         $('body').css('padding-bottom', footerHeight + 20 + 'px');
          
          
        // 窗口大小改变时重新计算
         $(window).resize(function() {
         $(window).resize(function() {
             var newHeight = footer.outerHeight();
             var newHeight = footer.outerHeight();
第54行: 第70行:
         });
         });
     }
     }
});


     // ==================== 3. 角色卡片悬停与侧边栏对齐(首页用) ====================
$(function() {
     // 为角色卡片添加悬停效果(可选,纯CSS已有,这里作为备用)
     $('.character-card').hover(
     $('.character-card').hover(
         function() { $(this).addClass('hover'); },
         function() { $(this).addClass('hover'); },
第61行: 第79行:
     );
     );
      
      
    // 动态计算右侧边栏高度(可选,用于对齐)
     function adjustSidebarHeight() {
     function adjustSidebarHeight() {
         var leftHeight = $('.custom-homepage .left-column').outerHeight();
         var leftHeight = $('.custom-homepage .left-column').outerHeight();
第69行: 第88行:
     }
     }
      
      
    // 延迟执行,等待图片加载完成
     setTimeout(adjustSidebarHeight, 500);
     setTimeout(adjustSidebarHeight, 500);
     $(window).resize(adjustSidebarHeight);
     $(window).resize(adjustSidebarHeight);
});


    // ==================== 4. 旧版筛选器(锚点点击筛选 .role-card) ====================
/* ========== 棋子图鉴筛选功能(固定羁绊 + 包含匹配) ========== */
    $('a[href^="#"]').click(function(e) {
$(function() {
        e.preventDefault();
    var pageTitle = mw.config.get('wgTitle');
        var filter = $(this).attr('href').substring(1);
    if (pageTitle !== '棋子' && pageTitle !== '棋子图鉴') return;


         if (filter === '全部') {
    // ----------------------------------------------
            $('.role-card').show();
    // 【自定义区域】请在这里填入你需要的固定羁绊列表
             return;
    // 筛选时会判断棋子的“羁绊”列是否包含这些字符串
    // ----------------------------------------------
    var FIXED_BOND_LIST = [
         "护卫", "暗杀者", "圣盾战士", "裁决使", "冰之魔女", "保镖", "重装战士", "神使者", "Geass", "雪下的誓言", "镜花水月", "神眼疾手", "武斗学院", "圆环之理", "救济的魔女", "叛逆的物语", "战略分析", "勇者", "东京食尸鬼", "坤比", "杀人冲动", "狂战士", "水之女神", "木灵使", "湖上的冰精", "叛逆小队", "游戏开发部", "法师", "狙神", "蓄力一击", "快枪手", "附魔师", "魔法少女", "迅击战士", "杀手", "宇智波的末裔", "六道之力", "我的回合抽卡", "最后的月牙天冲", "秘仪之影", "幕后花手", "中二病", "漆黑烈焰使", "世界的加护", "死亡笔记","奇迹之星","我的刀盾","圣祈凝辉","锻刀匠"
    ];  // 👈 按你的实际需要修改或增删
 
    // 等待 Cargo 表格出现
    var maxAttempts = 50;
    var attempt = 0;
    var interval = setInterval(function() {
        var $table = $('table.cargoDynamicTable, table.cargoTable');
        if ($table.length > 0) {
            clearInterval(interval);
            initFilters($table);
        } else if (++attempt >= maxAttempts) {
             clearInterval(interval);
            console.warn('棋子筛选器:未找到 Cargo 表格');
         }
         }
    }, 200);
    function initFilters($table) {
        var $rows = $table.find('tbody tr');
        if ($rows.length === 0) return;
        if ($('#chess-filter-container').length) return;


         $('.role-card').each(function() {
         // 动态获取列索引
             var text = $(this).text();
        var headerCells = $table.find('thead tr th');
             if (text.includes(filter)) {
        var colMap = {};
                $(this).show();
        headerCells.each(function(index) {
             } else {
             var text = $(this).text().trim();
                $(this).hide();
             if (text.includes('稀有度')) colMap.rarity = index;
             }
            else if (text.includes('费用')) colMap.cost = index;
             else if (text.includes('定位')) colMap.role = index;
             else if (text.includes('羁绊')) colMap.bond = index;
         });
         });
    });
        var COL_RARITY = colMap.rarity !== undefined ? colMap.rarity : 4;
        var COL_COST    = colMap.cost  !== undefined ? colMap.cost  : 5;
        var COL_ROLE    = colMap.role  !== undefined ? colMap.role  : 6;
        var COL_BOND    = colMap.bond  !== undefined ? colMap.bond  : 7;
 
        // 获取其他筛选器的唯一值(稀有度、费用、定位)保持不变
        function getUniqueValues(colIndex) {
            var set = new Set();
            $rows.each(function() {
                var text = $(this).find('td').eq(colIndex).text().trim();
                if (text) set.add(text);
            });
            return Array.from(set).sort((a,b) => a.localeCompare(b, 'zh-CN'));
        }
        var rarityOpts = getUniqueValues(COL_RARITY);
        var costOpts  = getUniqueValues(COL_COST);
        var roleOpts  = getUniqueValues(COL_ROLE);
 
        // 羁绊选项直接使用固定列表(已排序)
        var bondOpts = FIXED_BOND_LIST.slice().sort((a,b) => a.localeCompare(b, 'zh-CN'));
 
        // 构建筛选器界面
        var $filterDiv = $('<div id="chess-filter-container" style="margin:20px 0;padding:15px;background:rgba(255,255,255,0.9);border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.1);"></div>');
        var $rowDiv = $('<div style="display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end;"></div>');


    // ==================== 5. 棋子图鉴表格筛选器(新版) ====================
        function createSelect(labelText, id, optionsArray) {
    // 仅在包含筛选面板和表格的页面运行
            var $wrapper = $('<div style="min-width:120px;"></div>');
    if ($('#chess-filter-panel').length > 0 && $('.chess-table').length > 0) {
            $wrapper.append($('<label style="display:block;font-weight:bold;margin-bottom:5px;color:#2c3e50;">').text(labelText));
        initChessTableFilter();
            var $select = $('<select style="width:100%;padding:6px;border-radius:6px;border:1px solid #ccc;">').attr('id', id);
    }
            $select.append($('<option value="">').text('全部'));
});
            optionsArray.forEach(function(val) {
                $select.append($('<option>').attr('value', val).text(val));
            });
            $wrapper.append($select);
            return $wrapper;
        }


/**
        $rowDiv.append(createSelect('⭐ 稀有度', 'filter-rarity', rarityOpts));
* 棋子图鉴表格筛选器初始化函数
        $rowDiv.append(createSelect('💰 费用', 'filter-cost', costOpts));
* 依赖:页面需包含 #chess-filter-panel、.chess-table、#rarity-filter-group、#role-filter-group 等元素
        $rowDiv.append(createSelect('⚔️ 定位', 'filter-role', roleOpts));
*/
        $rowDiv.append(createSelect('🔗 羁绊', 'filter-bond', bondOpts)); // 使用固定羁绊列表
function initChessTableFilter() {
    // 配置参数(可根据实际字段顺序调整)
    const COL_RARITY = 4;   // 稀有度列索引(从0开始)
    const COL_ROLE = 6;    // 定位列索引(从0开始)
    const DEBUG = false;    // 调试开关


    const table = document.querySelector('.chess-table');
        var $btnWrapper = $('<div></div>');
    if (!table) return;
        var $resetBtn = $('<button id="reset-filters" style="padding:6px 20px;background:#2c3e50;color:#fff;border:none;border-radius:20px;cursor:pointer;font-weight:bold;">重置筛选</button>');
        $btnWrapper.append($resetBtn);
        $rowDiv.append($btnWrapper);


    const tbody = table.querySelector('tbody');
        var $stats = $('<div id="filter-stats" style="margin-top:10px;font-size:14px;color:#555;"></div>');
    if (!tbody) return;
        $filterDiv.append($rowDiv).append($stats);
        $table.before($filterDiv);


    let rows = [];
        var $raritySelect = $('#filter-rarity');
    const allRarities = new Set();
        var $costSelect = $('#filter-cost');
    const allRoles = new Set();
        var $roleSelect = $('#filter-role');
        var $bondSelect = $('#filter-bond');


    const rarityGroup = document.getElementById('rarity-filter-group');
        function applyFilters() {
    const roleGroup = document.getElementById('role-filter-group');
            var rarity = $raritySelect.val() || '';
    const resetBtn = document.getElementById('reset-filters');
            var cost = $costSelect.val() || '';
    const statsDiv = document.getElementById('filter-stats');
            var role = $roleSelect.val() || '';
            var bond = $bondSelect.val() || ''; // 固定羁绊选中的值


    // 解析表格数据,提取所有唯一值
            var visibleCount = 0;
    function parseTableData() {
            $rows.each(function() {
        rows = Array.from(tbody.querySelectorAll('tr'));
                var $tds = $(this).find('td');
                var rowRarity = $tds.eq(COL_RARITY).text().trim();
                var rowCost  = $tds.eq(COL_COST).text().trim();
                var rowRole  = $tds.eq(COL_ROLE).text().trim();
                var rowBond  = $tds.eq(COL_BOND).text().trim();  // 示例:"龙, 法师" 或 "斗士"


        rows.forEach((row, index) => {
                var match = true;
            if (row.querySelector('th')) return; // 跳过表头行
                if (rarity && rowRarity !== rarity) match = false;
                if (cost  && rowCost  !== cost)   match = false;
                if (role  && rowRole  !== role)  match = false;
                // 【关键修改】羁绊筛选改为包含匹配(包含关系)
                if (bond  && !rowBond.includes(bond)) match = false;


            const cells = row.cells;
                if (match) {
            if (cells.length <= Math.max(COL_RARITY, COL_ROLE)) {
                    $(this).show();
                DEBUG && console.warn('[ChessFilter] 行 ' + index + ' 列数不足');
                    visibleCount++;
                 return;
                } else {
             }
                    $(this).hide();
                 }
             });


             const rarityCell = cells[COL_RARITY];
             $stats.text('当前显示 ' + visibleCount + ' 个棋子(共 ' + $rows.length + ' 个)');
            const roleCell = cells[COL_ROLE];


             if (rarityCell) {
            var $noRow = $table.find('.no-results-row');
                 const text = rarityCell.textContent.trim();
             if (visibleCount === 0) {
                if (text) allRarities.add(text);
                 if ($noRow.length === 0) {
            }
                    var colSpan = $table.find('thead tr th').length;
            if (roleCell) {
                    $table.find('tbody').append(
                const text = roleCell.textContent.trim();
                        $('<tr class="no-results-row">').append(
                 if (text) allRoles.add(text);
                            $('<td>').attr('colspan', colSpan).css({
                                'text-align': 'center',
                                'padding': '20px',
                                'color': '#999'
                            }).text('没有符合条件的棋子')
                        )
                    );
                 }
            } else {
                $noRow.remove();
             }
             }
        }
        $raritySelect.on('change', applyFilters);
        $costSelect.on('change', applyFilters);
        $roleSelect.on('change', applyFilters);
        $bondSelect.on('change', applyFilters);
        $('#reset-filters').on('click', function() {
            $raritySelect.val('');
            $costSelect.val('');
            $roleSelect.val('');
            $bondSelect.val('');
            applyFilters();
         });
         });


         DEBUG && console.log('[ChessFilter] 稀有度列表:', Array.from(allRarities));
         applyFilters();
        DEBUG && console.log('[ChessFilter] 定位列表:', Array.from(allRoles));
     }
     }
});


     // 动态生成复选框
/* ========== 装备图鉴筛选功能(仅类型、获取方式) ========== */
     function buildFilterCheckboxes() {
$(function() {
        if (!rarityGroup || !roleGroup) return;
     // 判断是否为装备图鉴页面
     var pageTitle = mw.config.get('wgTitle');
    if (pageTitle !== '装备图鉴') return;


         rarityGroup.innerHTML = '';
    // 等待 Cargo 表格出现(最多等待 5 秒)
         roleGroup.innerHTML = '';
    var maxAttempts = 50;
    var attempt = 0;
    var interval = setInterval(function() {
         var $table = $('table.cargoDynamicTable, table.cargoTable');
         if ($table.length > 0) {
            clearInterval(interval);
            initEquipmentFilters($table);
        } else if (++attempt >= maxAttempts) {
            clearInterval(interval);
            console.warn('装备图鉴筛选器:未找到 Cargo 表格');
        }
    }, 200);


         const sortedRarities = Array.from(allRarities).sort();
    function initEquipmentFilters($table) {
         const sortedRoles = Array.from(allRoles).sort();
         var $rows = $table.find('tbody tr');
         if ($rows.length === 0) return;


         sortedRarities.forEach(rarity => {
         // 避免重复创建筛选器
            const label = document.createElement('label');
        if ($('#equipment-filter-container').length) return;
            label.style.marginRight = '12px';
            label.style.cursor = 'pointer';


            const checkbox = document.createElement('input');
        // 通过表头动态获取列索引(更稳健)
            checkbox.type = 'checkbox';
        var headerCells = $table.find('thead tr th');
             checkbox.className = 'filter-checkbox';
        var colMap = {};
             checkbox.dataset.type = 'rarity';
        headerCells.each(function(index) {
            checkbox.value = rarity;
             var text = $(this).text().trim();
             checkbox.addEventListener('change', applyFilters);
             if (text.includes('类型')) colMap.type = index;
             else if (text.includes('获取方式')) colMap.source = index;
        });


            label.appendChild(checkbox);
        // 回退到固定索引(根据您的 fields 顺序:图片,图片文件名,名称,_pageName,类型,获取方式,合成公式)
            label.appendChild(document.createTextNode(' ' + rarity));
        var COL_TYPE  = colMap.type  !== undefined ? colMap.type  : 4; // 类型
            rarityGroup.appendChild(label);
        var COL_SOURCE = colMap.source !== undefined ? colMap.source : 5; // 获取方式
        });


         sortedRoles.forEach(role => {
         // 从表格提取唯一值
             const label = document.createElement('label');
        function getUniqueValues(colIndex) {
             label.style.marginRight = '12px';
             var set = new Set();
             label.style.cursor = 'pointer';
             $rows.each(function() {
                var text = $(this).find('td').eq(colIndex).text().trim();
                if (text) set.add(text);
            });
             return Array.from(set).sort(function(a, b) {
                return a.localeCompare(b, 'zh-CN');
            });
        }


            const checkbox = document.createElement('input');
        var typeOpts  = getUniqueValues(COL_TYPE);
            checkbox.type = 'checkbox';
        var sourceOpts = getUniqueValues(COL_SOURCE);
            checkbox.className = 'filter-checkbox';
            checkbox.dataset.type = 'role';
            checkbox.value = role;
            checkbox.addEventListener('change', applyFilters);


            label.appendChild(checkbox);
        // 构建筛选器容器
            label.appendChild(document.createTextNode(' ' + role));
        var $filterDiv = $('<div id="equipment-filter-container" style="margin:20px 0;padding:15px;background:rgba(255,255,255,0.9);border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.1);"></div>');
            roleGroup.appendChild(label);
        var $rowDiv = $('<div style="display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end;"></div>');
        });


         if (sortedRarities.length === 0) {
         // 创建下拉框的辅助函数
             rarityGroup.innerHTML = '<span style="color: #999;">无数据</span>';
        function createSelect(labelText, id, optionsArray) {
            var $wrapper = $('<div style="min-width:160px;"></div>');
            $wrapper.append($('<label style="display:block;font-weight:bold;margin-bottom:5px;color:#2c3e50;">').text(labelText));
             var $select = $('<select style="width:100%;padding:6px;border-radius:6px;border:1px solid #ccc;">').attr('id', id);
            $select.append($('<option value="">').text('全部'));
            optionsArray.forEach(function(val) {
                $select.append($('<option>').attr('value', val).text(val));
            });
            $wrapper.append($select);
            return $wrapper;
         }
         }
        if (sortedRoles.length === 0) {
            roleGroup.innerHTML = '<span style="color: #999;">无数据</span>';
        }
    }


    // 执行筛选
        $rowDiv.append(createSelect('📦 类型', 'filter-type', typeOpts));
    function applyFilters() {
        $rowDiv.append(createSelect('🔍 获取方式', 'filter-source', sourceOpts));
        const selectedRarities = new Set();
 
        const selectedRoles = new Set();
        var $btnWrapper = $('<div></div>');
        var $resetBtn = $('<button id="reset-equipment-filters" style="padding:6px 20px;background:#2c3e50;color:#fff;border:none;border-radius:20px;cursor:pointer;font-weight:bold;">重置筛选</button>');
        $btnWrapper.append($resetBtn);
        $rowDiv.append($btnWrapper);
 
        var $stats = $('<div id="equipment-filter-stats" style="margin-top:10px;font-size:14px;color:#555;"></div>');
        $filterDiv.append($rowDiv).append($stats);
 
        // 插入到表格前
        $table.before($filterDiv);
 
        // 绑定筛选逻辑
        var $typeSelect = $('#filter-type');
        var $sourceSelect = $('#filter-source');
 
        function applyFilters() {
            var type = $typeSelect.val() || '';
            var source = $sourceSelect.val() || '';
 
            var visibleCount = 0;
            $rows.each(function() {
                var $tds = $(this).find('td');
                var rowType  = $tds.eq(COL_TYPE).text().trim();
                var rowSource = $tds.eq(COL_SOURCE).text().trim();
 
                var match = true;
                if (type  && rowType  !== type)  match = false;
                if (source && rowSource !== source) match = false;


        document.querySelectorAll('.filter-checkbox[data-type="rarity"]:checked').forEach(cb => {
                if (match) {
            selectedRarities.add(cb.value);
                    $(this).show();
        });
                    visibleCount++;
        document.querySelectorAll('.filter-checkbox[data-type="role"]:checked').forEach(cb => {
                } else {
            selectedRoles.add(cb.value);
                    $(this).hide();
        });
                }
            });


        let visibleCount = 0;
            $stats.text('当前显示 ' + visibleCount + ' 件装备(共 ' + $rows.length + ' 件)');


        rows.forEach(row => {
            // 无结果时添加提示行
            if (row.querySelector('th')) {
            var $noRow = $table.find('.no-results-row');
                row.style.display = '';
            if (visibleCount === 0) {
                 return;
                if ($noRow.length === 0) {
                    var colSpan = $table.find('thead tr th').length;
                    $table.find('tbody').append(
                        $('<tr class="no-results-row">').append(
                            $('<td>').attr('colspan', colSpan).css({
                                'text-align': 'center',
                                'padding': '20px',
                                'color': '#999'
                            }).text('没有符合条件的装备')
                        )
                    );
                 }
            } else {
                $noRow.remove();
             }
             }
        }
        $typeSelect.on('change', applyFilters);
        $sourceSelect.on('change', applyFilters);
        $('#reset-equipment-filters').on('click', function() {
            $typeSelect.val('');
            $sourceSelect.val('');
            applyFilters();
        });
        // 初始统计
        applyFilters();
    }
});


             const cells = row.cells;
// 推荐直播间轮播切换(仅圆点版本,无箭头)
             if (cells.length <= Math.max(COL_RARITY, COL_ROLE)) {
(function() {
                row.style.display = 'none';
    var streams = [
                return;
        {
             }
            name: "B站主播:我就要迟到了哎",
            desc: "点击图片跳转至直播间",
             cover: "https://www.war3whj.top/war3wiki/images/b/ba/%E4%B8%BB%E6%92%AD1.png",
             link: "https://live.bilibili.com/1896524667"
        },
        {
            name: "B站主播:迦尔纳_Karna",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/d/d5/%E4%B8%BB%E6%92%AD2.png",
            link: "https://live.bilibili.com/14628031"
        },
        {
            name: "B站主播:Elaina美好(地图作者)",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/9/9d/%E4%B8%BB%E6%92%AD3.png",
             link: "https://live.bilibili.com/9457306"
        }
    ];


            const rarityCell = cells[COL_RARITY];
    var AUTO_INTERVAL = 5000;
            const roleCell = cells[COL_ROLE];
    var currentIndex = 0;
            if (!rarityCell || !roleCell) {
    var total = streams.length;
                row.style.display = 'none';
    var timer = null;
                return;
            }


            const rarityText = rarityCell.textContent.trim();
    var coverDiv = document.getElementById('live-cover-img');
            const roleText = roleCell.textContent.trim();
    var nameSpan = document.getElementById('live-name');
    var descSpan = document.getElementById('live-desc');
    var dotsContainer = document.getElementById('live-dots');


             let show = true;
    // 生成圆点
             if (selectedRarities.size > 0 && !selectedRarities.has(rarityText)) {
    function buildDots() {
                 show = false;
        if (!dotsContainer) return;
        dotsContainer.innerHTML = '';
        for (var i = 0; i < total; i++) {
             var dot = document.createElement('span');
            dot.setAttribute('data-index', i);
             dot.style.cssText = 'width: 10px; height: 10px; border-radius: 50%; background: rgba(255,255,255,0.5); cursor: pointer; transition: all 0.2s; display: inline-block;';
            if (i === currentIndex) {
                 dot.style.background = 'white';
                dot.style.transform = 'scale(1.2)';
             }
             }
             if (selectedRoles.size > 0 && !selectedRoles.has(roleText)) {
             dot.addEventListener('click', (function(idx) {
                 show = false;
                return function() {
                    stopAutoPlay();
                    currentIndex = idx;
                    updateDisplay();
                    startAutoPlay();
                };
            })(i));
            dotsContainer.appendChild(dot);
        }
    }
 
    function updateDots() {
        if (!dotsContainer) return;
        var dots = dotsContainer.querySelectorAll('span');
        for (var i = 0; i < dots.length; i++) {
            var dot = dots[i];
            if (i === currentIndex) {
                dot.style.background = 'white';
                dot.style.transform = 'scale(1.2)';
            } else {
                 dot.style.background = 'rgba(255,255,255,0.5)';
                dot.style.transform = 'scale(1)';
             }
             }
        }
    }


             row.style.display = show ? '' : 'none';
    function updateDisplay() {
             if (show) visibleCount++;
        var data = streams[currentIndex];
         });
        if (!data) return;
        if (coverDiv) {
             coverDiv.style.backgroundImage = 'url(' + data.cover + ')';
             coverDiv.setAttribute('data-link', data.link);
        }
        if (nameSpan) nameSpan.textContent = data.name;
        if (descSpan) descSpan.textContent = data.desc;
        updateDots();
    }
 
    function next() {
        currentIndex = (currentIndex + 1) % total;
         updateDisplay();
    }


         updateStats(visibleCount, rows.length);
    function prev() {
        currentIndex = (currentIndex - 1 + total) % total;
         updateDisplay();
     }
     }


    // 重置筛选
     function startAutoPlay() {
     function resetFilters() {
         if (timer) clearInterval(timer);
         document.querySelectorAll('.filter-checkbox').forEach(cb => cb.checked = false);
         timer = setInterval(next, AUTO_INTERVAL);
         applyFilters();
     }
     }


    // 更新统计信息
     function stopAutoPlay() {
     function updateStats(visible, total) {
         if (timer) {
         if (statsDiv) {
             clearInterval(timer);
             const hidden = total - visible;
             timer = null;
             statsDiv.innerHTML = `共 ${total} 个棋子,当前显示 ${visible} 个` +
                (hidden > 0 ? `(隐藏 ${hidden} 个)` : '');
         }
         }
     }
     }


    // 初始化
     function init() {
     function init() {
         parseTableData();
         if (!coverDiv) return;
        buildFilterCheckboxes();


         if (resetBtn) {
        coverDiv.addEventListener('click', function() {
             resetBtn.addEventListener('click', resetFilters);
            var link = coverDiv.getAttribute('data-link');
            if (link) window.open(link, '_blank');
        });
 
        buildDots();
        updateDisplay();
        startAutoPlay();
 
        var container = document.getElementById('live-carousel-container');
         if (container) {
             container.addEventListener('mouseenter', stopAutoPlay);
            container.addEventListener('mouseleave', startAutoPlay);
         }
         }
    }


        updateStats(rows.length, rows.length);
    if (document.readyState === 'loading') {
         DEBUG && console.log('[ChessFilter] 初始化完成');
         document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
     }
     }
 
})();
    init();
 
    // 监听表格变化(应对 dynamic table 分页或动态刷新)
    const observer = new MutationObserver(function() {
        DEBUG && console.log('[ChessFilter] 检测到表格内容变化,重新解析数据');
        allRarities.clear();
        allRoles.clear();
        parseTableData();
        applyFilters();
    });
 
    observer.observe(tbody, { childList: true, subtree: true });
    observer.observe(table, { childList: true, subtree: true });
}

2026年5月22日 (五) 21:59的最新版本

/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
$(function() {
    // 检查是否已存在导航栏,避免重复添加
    if ($('.fixed-top-nav').length === 0) {
        
        // 导航栏 HTML 结构
        var navHtml = `
            <div class="fixed-top-nav">
                <a href="首页" class="nav-logo">
                    <img src="/wikibg/logo.jpg" alt="网站Logo">
                    <span>万华镜</span>
                </a>
                <div class="nav-links">
                    <a href="首页" class="nav-link">
                        📚 首页
                    </a>
                    <a href="游戏攻略" class="nav-link">
                        📖 游戏攻略
                    </a>
                    <a href="棋子" class="nav-link">
                        ⚔️ 棋子图鉴
                    </a>
                    <a href="天赋图鉴" class="nav-link">
                        🗺️ 天赋图鉴
                    </a>
                    <a href="装备图鉴" class="nav-link">
                        📊 装备图鉴
                    </a>
                     <a href="兑换中心" class="nav-link">
                        📊 兑换中心
                    </a>
                     <a href="羁绊详情" class="nav-link">
                        📊 羁绊详情
                    </a>
                    <a href="https://www.war3whj.top/war3wiki/moniqi/moniqi.html" class="nav-link">
                        📊 阵容模拟器
                    </a>
                </div>
            </div>
        `;
        
        // 将导航栏插入到 body 开头
        $('body').prepend(navHtml);
        
        // 滚动时添加效果(可选)
        $(window).scroll(function() {
            if ($(window).scrollTop() > 50) {
                $('.fixed-top-nav').addClass('scrolled');
            } else {
                $('.fixed-top-nav').removeClass('scrolled');
            }
        });
    }
});


$(function() {
    // 确保页脚固定在底部
    var footer = $('#footer, .mw-footer');
    
    if (footer.length > 0) {
        // 设置底部内边距避免内容被遮挡
        var footerHeight = footer.outerHeight();
        $('body').css('padding-bottom', footerHeight + 20 + 'px');
        
        // 窗口大小改变时重新计算
        $(window).resize(function() {
            var newHeight = footer.outerHeight();
            $('body').css('padding-bottom', newHeight + 20 + 'px');
        });
    }
});

$(function() {
    // 为角色卡片添加悬停效果(可选,纯CSS已有,这里作为备用)
    $('.character-card').hover(
        function() { $(this).addClass('hover'); },
        function() { $(this).removeClass('hover'); }
    );
    
    // 动态计算右侧边栏高度(可选,用于对齐)
    function adjustSidebarHeight() {
        var leftHeight = $('.custom-homepage .left-column').outerHeight();
        var rightHeight = $('.custom-homepage .right-column').outerHeight();
        if (rightHeight < leftHeight && $(window).width() > 768) {
            $('.custom-homepage .right-column').css('min-height', leftHeight);
        }
    }
    
    // 延迟执行,等待图片加载完成
    setTimeout(adjustSidebarHeight, 500);
    $(window).resize(adjustSidebarHeight);
});

/* ========== 棋子图鉴筛选功能(固定羁绊 + 包含匹配) ========== */
$(function() {
    var pageTitle = mw.config.get('wgTitle');
    if (pageTitle !== '棋子' && pageTitle !== '棋子图鉴') return;

    // ----------------------------------------------
    // 【自定义区域】请在这里填入你需要的固定羁绊列表
    // 筛选时会判断棋子的“羁绊”列是否包含这些字符串
    // ----------------------------------------------
    var FIXED_BOND_LIST = [
        "护卫", "暗杀者", "圣盾战士", "裁决使", "冰之魔女", "保镖", "重装战士", "神使者", "Geass", "雪下的誓言", "镜花水月", "神眼疾手", "武斗学院", "圆环之理", "救济的魔女", "叛逆的物语", "战略分析", "勇者", "东京食尸鬼", "坤比", "杀人冲动", "狂战士", "水之女神", "木灵使", "湖上的冰精", "叛逆小队", "游戏开发部", "法师", "狙神", "蓄力一击", "快枪手", "附魔师", "魔法少女", "迅击战士", "杀手", "宇智波的末裔", "六道之力", "我的回合抽卡", "最后的月牙天冲", "秘仪之影", "幕后花手", "中二病", "漆黑烈焰使", "世界的加护", "死亡笔记","奇迹之星","我的刀盾","圣祈凝辉","锻刀匠"
    ];  // 👈 按你的实际需要修改或增删

    // 等待 Cargo 表格出现
    var maxAttempts = 50;
    var attempt = 0;
    var interval = setInterval(function() {
        var $table = $('table.cargoDynamicTable, table.cargoTable');
        if ($table.length > 0) {
            clearInterval(interval);
            initFilters($table);
        } else if (++attempt >= maxAttempts) {
            clearInterval(interval);
            console.warn('棋子筛选器:未找到 Cargo 表格');
        }
    }, 200);

    function initFilters($table) {
        var $rows = $table.find('tbody tr');
        if ($rows.length === 0) return;
        if ($('#chess-filter-container').length) return;

        // 动态获取列索引
        var headerCells = $table.find('thead tr th');
        var colMap = {};
        headerCells.each(function(index) {
            var text = $(this).text().trim();
            if (text.includes('稀有度')) colMap.rarity = index;
            else if (text.includes('费用')) colMap.cost = index;
            else if (text.includes('定位')) colMap.role = index;
            else if (text.includes('羁绊')) colMap.bond = index;
        });
        var COL_RARITY = colMap.rarity !== undefined ? colMap.rarity : 4;
        var COL_COST    = colMap.cost   !== undefined ? colMap.cost   : 5;
        var COL_ROLE    = colMap.role   !== undefined ? colMap.role   : 6;
        var COL_BOND    = colMap.bond   !== undefined ? colMap.bond   : 7;

        // 获取其他筛选器的唯一值(稀有度、费用、定位)保持不变
        function getUniqueValues(colIndex) {
            var set = new Set();
            $rows.each(function() {
                var text = $(this).find('td').eq(colIndex).text().trim();
                if (text) set.add(text);
            });
            return Array.from(set).sort((a,b) => a.localeCompare(b, 'zh-CN'));
        }
        var rarityOpts = getUniqueValues(COL_RARITY);
        var costOpts   = getUniqueValues(COL_COST);
        var roleOpts   = getUniqueValues(COL_ROLE);

        // 羁绊选项直接使用固定列表(已排序)
        var bondOpts = FIXED_BOND_LIST.slice().sort((a,b) => a.localeCompare(b, 'zh-CN'));

        // 构建筛选器界面
        var $filterDiv = $('<div id="chess-filter-container" style="margin:20px 0;padding:15px;background:rgba(255,255,255,0.9);border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.1);"></div>');
        var $rowDiv = $('<div style="display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end;"></div>');

        function createSelect(labelText, id, optionsArray) {
            var $wrapper = $('<div style="min-width:120px;"></div>');
            $wrapper.append($('<label style="display:block;font-weight:bold;margin-bottom:5px;color:#2c3e50;">').text(labelText));
            var $select = $('<select style="width:100%;padding:6px;border-radius:6px;border:1px solid #ccc;">').attr('id', id);
            $select.append($('<option value="">').text('全部'));
            optionsArray.forEach(function(val) {
                $select.append($('<option>').attr('value', val).text(val));
            });
            $wrapper.append($select);
            return $wrapper;
        }

        $rowDiv.append(createSelect('⭐ 稀有度', 'filter-rarity', rarityOpts));
        $rowDiv.append(createSelect('💰 费用', 'filter-cost', costOpts));
        $rowDiv.append(createSelect('⚔️ 定位', 'filter-role', roleOpts));
        $rowDiv.append(createSelect('🔗 羁绊', 'filter-bond', bondOpts));  // 使用固定羁绊列表

        var $btnWrapper = $('<div></div>');
        var $resetBtn = $('<button id="reset-filters" style="padding:6px 20px;background:#2c3e50;color:#fff;border:none;border-radius:20px;cursor:pointer;font-weight:bold;">重置筛选</button>');
        $btnWrapper.append($resetBtn);
        $rowDiv.append($btnWrapper);

        var $stats = $('<div id="filter-stats" style="margin-top:10px;font-size:14px;color:#555;"></div>');
        $filterDiv.append($rowDiv).append($stats);
        $table.before($filterDiv);

        var $raritySelect = $('#filter-rarity');
        var $costSelect = $('#filter-cost');
        var $roleSelect = $('#filter-role');
        var $bondSelect = $('#filter-bond');

        function applyFilters() {
            var rarity = $raritySelect.val() || '';
            var cost = $costSelect.val() || '';
            var role = $roleSelect.val() || '';
            var bond = $bondSelect.val() || '';  // 固定羁绊选中的值

            var visibleCount = 0;
            $rows.each(function() {
                var $tds = $(this).find('td');
                var rowRarity = $tds.eq(COL_RARITY).text().trim();
                var rowCost   = $tds.eq(COL_COST).text().trim();
                var rowRole   = $tds.eq(COL_ROLE).text().trim();
                var rowBond   = $tds.eq(COL_BOND).text().trim();  // 示例:"龙, 法师" 或 "斗士"

                var match = true;
                if (rarity && rowRarity !== rarity) match = false;
                if (cost   && rowCost   !== cost)   match = false;
                if (role   && rowRole   !== role)   match = false;
                // 【关键修改】羁绊筛选改为包含匹配(包含关系)
                if (bond   && !rowBond.includes(bond)) match = false;

                if (match) {
                    $(this).show();
                    visibleCount++;
                } else {
                    $(this).hide();
                }
            });

            $stats.text('当前显示 ' + visibleCount + ' 个棋子(共 ' + $rows.length + ' 个)');

            var $noRow = $table.find('.no-results-row');
            if (visibleCount === 0) {
                if ($noRow.length === 0) {
                    var colSpan = $table.find('thead tr th').length;
                    $table.find('tbody').append(
                        $('<tr class="no-results-row">').append(
                            $('<td>').attr('colspan', colSpan).css({
                                'text-align': 'center',
                                'padding': '20px',
                                'color': '#999'
                            }).text('没有符合条件的棋子')
                        )
                    );
                }
            } else {
                $noRow.remove();
            }
        }

        $raritySelect.on('change', applyFilters);
        $costSelect.on('change', applyFilters);
        $roleSelect.on('change', applyFilters);
        $bondSelect.on('change', applyFilters);
        $('#reset-filters').on('click', function() {
            $raritySelect.val('');
            $costSelect.val('');
            $roleSelect.val('');
            $bondSelect.val('');
            applyFilters();
        });

        applyFilters();
    }
});

/* ========== 装备图鉴筛选功能(仅类型、获取方式) ========== */
$(function() {
    // 判断是否为装备图鉴页面
    var pageTitle = mw.config.get('wgTitle');
    if (pageTitle !== '装备图鉴') return;

    // 等待 Cargo 表格出现(最多等待 5 秒)
    var maxAttempts = 50;
    var attempt = 0;
    var interval = setInterval(function() {
        var $table = $('table.cargoDynamicTable, table.cargoTable');
        if ($table.length > 0) {
            clearInterval(interval);
            initEquipmentFilters($table);
        } else if (++attempt >= maxAttempts) {
            clearInterval(interval);
            console.warn('装备图鉴筛选器:未找到 Cargo 表格');
        }
    }, 200);

    function initEquipmentFilters($table) {
        var $rows = $table.find('tbody tr');
        if ($rows.length === 0) return;

        // 避免重复创建筛选器
        if ($('#equipment-filter-container').length) return;

        // 通过表头动态获取列索引(更稳健)
        var headerCells = $table.find('thead tr th');
        var colMap = {};
        headerCells.each(function(index) {
            var text = $(this).text().trim();
            if (text.includes('类型')) colMap.type = index;
            else if (text.includes('获取方式')) colMap.source = index;
        });

        // 回退到固定索引(根据您的 fields 顺序:图片,图片文件名,名称,_pageName,类型,获取方式,合成公式)
        var COL_TYPE   = colMap.type   !== undefined ? colMap.type   : 4; // 类型
        var COL_SOURCE = colMap.source !== undefined ? colMap.source : 5; // 获取方式

        // 从表格提取唯一值
        function getUniqueValues(colIndex) {
            var set = new Set();
            $rows.each(function() {
                var text = $(this).find('td').eq(colIndex).text().trim();
                if (text) set.add(text);
            });
            return Array.from(set).sort(function(a, b) {
                return a.localeCompare(b, 'zh-CN');
            });
        }

        var typeOpts   = getUniqueValues(COL_TYPE);
        var sourceOpts = getUniqueValues(COL_SOURCE);

        // 构建筛选器容器
        var $filterDiv = $('<div id="equipment-filter-container" style="margin:20px 0;padding:15px;background:rgba(255,255,255,0.9);border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.1);"></div>');
        var $rowDiv = $('<div style="display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end;"></div>');

        // 创建下拉框的辅助函数
        function createSelect(labelText, id, optionsArray) {
            var $wrapper = $('<div style="min-width:160px;"></div>');
            $wrapper.append($('<label style="display:block;font-weight:bold;margin-bottom:5px;color:#2c3e50;">').text(labelText));
            var $select = $('<select style="width:100%;padding:6px;border-radius:6px;border:1px solid #ccc;">').attr('id', id);
            $select.append($('<option value="">').text('全部'));
            optionsArray.forEach(function(val) {
                $select.append($('<option>').attr('value', val).text(val));
            });
            $wrapper.append($select);
            return $wrapper;
        }

        $rowDiv.append(createSelect('📦 类型', 'filter-type', typeOpts));
        $rowDiv.append(createSelect('🔍 获取方式', 'filter-source', sourceOpts));

        var $btnWrapper = $('<div></div>');
        var $resetBtn = $('<button id="reset-equipment-filters" style="padding:6px 20px;background:#2c3e50;color:#fff;border:none;border-radius:20px;cursor:pointer;font-weight:bold;">重置筛选</button>');
        $btnWrapper.append($resetBtn);
        $rowDiv.append($btnWrapper);

        var $stats = $('<div id="equipment-filter-stats" style="margin-top:10px;font-size:14px;color:#555;"></div>');
        $filterDiv.append($rowDiv).append($stats);

        // 插入到表格前
        $table.before($filterDiv);

        // 绑定筛选逻辑
        var $typeSelect = $('#filter-type');
        var $sourceSelect = $('#filter-source');

        function applyFilters() {
            var type = $typeSelect.val() || '';
            var source = $sourceSelect.val() || '';

            var visibleCount = 0;
            $rows.each(function() {
                var $tds = $(this).find('td');
                var rowType   = $tds.eq(COL_TYPE).text().trim();
                var rowSource = $tds.eq(COL_SOURCE).text().trim();

                var match = true;
                if (type   && rowType   !== type)   match = false;
                if (source && rowSource !== source) match = false;

                if (match) {
                    $(this).show();
                    visibleCount++;
                } else {
                    $(this).hide();
                }
            });

            $stats.text('当前显示 ' + visibleCount + ' 件装备(共 ' + $rows.length + ' 件)');

            // 无结果时添加提示行
            var $noRow = $table.find('.no-results-row');
            if (visibleCount === 0) {
                if ($noRow.length === 0) {
                    var colSpan = $table.find('thead tr th').length;
                    $table.find('tbody').append(
                        $('<tr class="no-results-row">').append(
                            $('<td>').attr('colspan', colSpan).css({
                                'text-align': 'center',
                                'padding': '20px',
                                'color': '#999'
                            }).text('没有符合条件的装备')
                        )
                    );
                }
            } else {
                $noRow.remove();
            }
        }

        $typeSelect.on('change', applyFilters);
        $sourceSelect.on('change', applyFilters);
        $('#reset-equipment-filters').on('click', function() {
            $typeSelect.val('');
            $sourceSelect.val('');
            applyFilters();
        });

        // 初始统计
        applyFilters();
    }
});

// 推荐直播间轮播切换(仅圆点版本,无箭头)
(function() {
    var streams = [
        {
            name: "B站主播:我就要迟到了哎",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/b/ba/%E4%B8%BB%E6%92%AD1.png",
            link: "https://live.bilibili.com/1896524667"
        },
        {
            name: "B站主播:迦尔纳_Karna",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/d/d5/%E4%B8%BB%E6%92%AD2.png",
            link: "https://live.bilibili.com/14628031"
        },
        {
            name: "B站主播:Elaina美好(地图作者)",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/9/9d/%E4%B8%BB%E6%92%AD3.png",
            link: "https://live.bilibili.com/9457306"
        }
    ];

    var AUTO_INTERVAL = 5000;
    var currentIndex = 0;
    var total = streams.length;
    var timer = null;

    var coverDiv = document.getElementById('live-cover-img');
    var nameSpan = document.getElementById('live-name');
    var descSpan = document.getElementById('live-desc');
    var dotsContainer = document.getElementById('live-dots');

    // 生成圆点
    function buildDots() {
        if (!dotsContainer) return;
        dotsContainer.innerHTML = '';
        for (var i = 0; i < total; i++) {
            var dot = document.createElement('span');
            dot.setAttribute('data-index', i);
            dot.style.cssText = 'width: 10px; height: 10px; border-radius: 50%; background: rgba(255,255,255,0.5); cursor: pointer; transition: all 0.2s; display: inline-block;';
            if (i === currentIndex) {
                dot.style.background = 'white';
                dot.style.transform = 'scale(1.2)';
            }
            dot.addEventListener('click', (function(idx) {
                return function() {
                    stopAutoPlay();
                    currentIndex = idx;
                    updateDisplay();
                    startAutoPlay();
                };
            })(i));
            dotsContainer.appendChild(dot);
        }
    }

    function updateDots() {
        if (!dotsContainer) return;
        var dots = dotsContainer.querySelectorAll('span');
        for (var i = 0; i < dots.length; i++) {
            var dot = dots[i];
            if (i === currentIndex) {
                dot.style.background = 'white';
                dot.style.transform = 'scale(1.2)';
            } else {
                dot.style.background = 'rgba(255,255,255,0.5)';
                dot.style.transform = 'scale(1)';
            }
        }
    }

    function updateDisplay() {
        var data = streams[currentIndex];
        if (!data) return;
        if (coverDiv) {
            coverDiv.style.backgroundImage = 'url(' + data.cover + ')';
            coverDiv.setAttribute('data-link', data.link);
        }
        if (nameSpan) nameSpan.textContent = data.name;
        if (descSpan) descSpan.textContent = data.desc;
        updateDots();
    }

    function next() {
        currentIndex = (currentIndex + 1) % total;
        updateDisplay();
    }

    function prev() {
        currentIndex = (currentIndex - 1 + total) % total;
        updateDisplay();
    }

    function startAutoPlay() {
        if (timer) clearInterval(timer);
        timer = setInterval(next, AUTO_INTERVAL);
    }

    function stopAutoPlay() {
        if (timer) {
            clearInterval(timer);
            timer = null;
        }
    }

    function init() {
        if (!coverDiv) return;

        coverDiv.addEventListener('click', function() {
            var link = coverDiv.getAttribute('data-link');
            if (link) window.open(link, '_blank');
        });

        buildDots();
        updateDisplay();
        startAutoPlay();

        var container = document.getElementById('live-carousel-container');
        if (container) {
            container.addEventListener('mouseenter', stopAutoPlay);
            container.addEventListener('mouseleave', startAutoPlay);
        }
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();