Common.js:修订间差异
来自卡厄思梦境WIKI
无编辑摘要 |
无编辑摘要 |
||
| 第269行: | 第269行: | ||
window.cardSystemInitialized = true; | window.cardSystemInitialized = true; | ||
// | // 缓存DOM元素 | ||
var overlayCache = null; | |||
var containerCache = null; | |||
// 创建遮罩层和容器(只创建一次) | |||
function createCardOverlay() { | function createCardOverlay() { | ||
if (overlayCache && containerCache) { | |||
return { overlay: overlayCache, container: containerCache }; | |||
} | |||
// 创建遮罩 | // 创建遮罩 | ||
var overlay = document.createElement('div'); | var overlay = document.createElement('div'); | ||
overlay.id = 'card-overlay'; | overlay.id = 'card-overlay'; | ||
overlay.style.cssText = 'display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.8); z-index: 9999;'; | overlay.style.cssText = 'display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.8); z-index: 9999; overflow-y: auto;'; | ||
// 创建容器 | // 创建容器 | ||
var container = document.createElement('div'); | var container = document.createElement('div'); | ||
container.id = 'card-display-container'; | container.id = 'card-display-container'; | ||
container.style.cssText = 'position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);'; | container.style.cssText = 'position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); min-height: 100vh; padding: 40px 20px; display: flex; align-items: center; justify-content: center;'; | ||
overlay.appendChild(container); | overlay.appendChild(container); | ||
| 第290行: | 第298行: | ||
} | } | ||
}); | }); | ||
overlayCache = overlay; | |||
containerCache = container; | |||
return { overlay: overlay, container: container }; | return { overlay: overlay, container: container }; | ||
| 第299行: | 第310行: | ||
if (overlay) { | if (overlay) { | ||
overlay.style.display = 'none'; | overlay.style.display = 'none'; | ||
overlay.querySelector('#card-display-container').innerHTML = ''; | var container = overlay.querySelector('#card-display-container'); | ||
if (container) { | |||
container.innerHTML = ''; | |||
} | |||
} | } | ||
} | } | ||
// 缓存API调用结果 | |||
var apiCache = {}; | |||
// 获取卡牌HTML(通过API调用模块) | // 获取卡牌HTML(通过API调用模块) | ||
function fetchCardHTML(character, cardName, deckType, callback) { | function fetchCardHTML(character, cardName, deckType, callback) { | ||
var cacheKey = character + '|' + cardName + '|' + (deckType || ''); | |||
// 检查缓存 | |||
if (apiCache[cacheKey]) { | |||
callback(apiCache[cacheKey]); | |||
return; | |||
} | |||
var api = new mw.Api(); | var api = new mw.Api(); | ||
var wikitext = '{{#invoke:卡牌|main|' + character + '|' + cardName + '|' + (deckType || '') + '}}'; | var wikitext = '{{#invoke:卡牌|main|' + character + '|' + cardName + '|' + (deckType || '') + '}}'; | ||
api.parse(wikitext).done(function(html) { | api.parse(wikitext).done(function(html) { | ||
apiCache[cacheKey] = html; // 缓存结果 | |||
callback(html); | callback(html); | ||
}).fail(function() { | }).fail(function() { | ||
| 第323行: | 第349行: | ||
var deckType = cardElement.dataset.deckType; | var deckType = cardElement.dataset.deckType; | ||
var derivedCards = cardElement.dataset.derivedCards; | var derivedCards = cardElement.dataset.derivedCards; | ||
// 创建内容包装器 | |||
var contentWrapper = document.createElement('div'); | |||
contentWrapper.style.cssText = 'display: flex; align-items: center; gap: 20px; position: relative;'; | |||
// 创建主卡牌容器 | // 创建主卡牌容器 | ||
var | var mainCardContainer = document.createElement('div'); | ||
mainCardContainer.style.cssText = 'position: relative; width: 336px; height: 460px; display: flex; align-items: center; justify-content: center;'; | |||
// 克隆并放大主卡牌 | // 克隆并放大主卡牌 | ||
var enlargedCard = cardElement.cloneNode(true); | var enlargedCard = cardElement.cloneNode(true); | ||
// | // 修复放大卡牌的样式 | ||
var | var cardInner = document.createElement('div'); | ||
cardInner.style.cssText = 'transform: scale(2); position: relative;'; | |||
mainCardContainer.appendChild( | cardInner.appendChild(enlargedCard); | ||
// 确保卡牌正确显示 | |||
enlargedCard.style.width = '168px'; | |||
enlargedCard.style.height = '230px'; | |||
enlargedCard.style.cursor = 'default'; | |||
enlargedCard.style.position = 'relative'; | |||
enlargedCard.style.display = 'block'; | |||
enlargedCard.onclick = null; | |||
mainCardContainer.appendChild(cardInner); | |||
// 处理衍生卡牌 | // 处理衍生卡牌 | ||
| 第344行: | 第382行: | ||
// 创建左侧容器 | // 创建左侧容器 | ||
var leftContainer = document.createElement('div'); | var leftContainer = document.createElement('div'); | ||
leftContainer.style.cssText = ' | leftContainer.style.cssText = 'display: flex; flex-direction: column; gap: 15px; align-items: flex-end;'; | ||
if (derivedCardsList.length > 1) { | if (derivedCardsList.length > 1) { | ||
// 多张衍生卡牌,添加查看所有按钮 | // 多张衍生卡牌,添加查看所有按钮 | ||
var viewAllBtn = document.createElement('div'); | var viewAllBtn = document.createElement('div'); | ||
viewAllBtn.style.cssText = 'padding: | viewAllBtn.style.cssText = 'padding: 10px 20px; background: linear-gradient(135deg, #4a90e2, #357abd); color: white; border-radius: 6px; cursor: pointer; white-space: nowrap; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); transition: transform 0.2s;'; | ||
viewAllBtn.textContent = '查看所有衍生卡牌'; | viewAllBtn.textContent = '查看所有衍生卡牌'; | ||
viewAllBtn.onmouseover = function() { this.style.transform = 'scale(1.05)'; }; | |||
viewAllBtn.onmouseout = function() { this.style.transform = 'scale(1)'; }; | |||
viewAllBtn.onclick = function() { | viewAllBtn.onclick = function() { | ||
showAllDerivedCards(character, derivedCardsList | showAllDerivedCards(character, derivedCardsList); | ||
}; | }; | ||
leftContainer.appendChild(viewAllBtn); | leftContainer.appendChild(viewAllBtn); | ||
| 第360行: | 第400行: | ||
var firstDerivedCard = document.createElement('div'); | var firstDerivedCard = document.createElement('div'); | ||
firstDerivedCard.id = 'derived-cards-display'; | firstDerivedCard.id = 'derived-cards-display'; | ||
firstDerivedCard.style.cssText = 'display: flex | firstDerivedCard.style.cssText = 'display: flex; align-items: center;'; | ||
fetchCardHTML(character, derivedCardsList[0].trim(), '', function(html) { | fetchCardHTML(character, derivedCardsList[0].trim(), '', function(html) { | ||
firstDerivedCard.innerHTML = html; | firstDerivedCard.innerHTML = html; | ||
var cards = firstDerivedCard.querySelectorAll('.game-card'); | var cards = firstDerivedCard.querySelectorAll('.game-card'); | ||
cards.forEach(function(card) { | cards.forEach(function(card) { | ||
| 第373行: | 第412行: | ||
leftContainer.appendChild(firstDerivedCard); | leftContainer.appendChild(firstDerivedCard); | ||
contentWrapper.appendChild(leftContainer); | |||
} | } | ||
contentWrapper.appendChild(mainCardContainer); | |||
// | // 创建按钮容器(放在主卡牌下方) | ||
var | var buttonsContainer = document.createElement('div'); | ||
buttonsContainer.style.cssText = 'position: absolute; bottom: -60px; left: 50%; transform: translateX(-50%); display: flex; gap: 15px; z-index: 10;'; | |||
// | // 预加载按钮,避免延迟 | ||
checkCardVariants(character, cardName, function(variants) { | checkCardVariants(character, cardName, function(variants) { | ||
if (variants.lingguang | if (variants.lingguang) { | ||
var | var lingguangBtn = document.createElement('div'); | ||
lingguangBtn.style.cssText = 'padding: 10px 24px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); transition: transform 0.2s;'; | |||
lingguangBtn.textContent = '灵光一闪'; | |||
lingguangBtn.onmouseover = function() { this.style.transform = 'scale(1.05)'; }; | |||
lingguangBtn.onmouseout = function() { this.style.transform = 'scale(1)'; }; | |||
lingguangBtn.onclick = function() { | |||
showVariantCards(character, cardName, '灵光一闪'); | |||
}; | |||
buttonsContainer.appendChild(lingguangBtn); | |||
} | |||
if (variants.shenguang) { | |||
var shenguangBtn = document.createElement('div'); | |||
shenguangBtn.style.cssText = 'padding: 10px 24px; background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); color: white; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); transition: transform 0.2s;'; | |||
shenguangBtn.textContent = '神之一闪'; | |||
shenguangBtn.onmouseover = function() { this.style.transform = 'scale(1.05)'; }; | |||
shenguangBtn.onmouseout = function() { this.style.transform = 'scale(1)'; }; | |||
shenguangBtn.onclick = function() { | |||
showVariantCards(character, cardName, '神之一闪'); | |||
}; | |||
buttonsContainer.appendChild(shenguangBtn); | |||
} | } | ||
}); | }); | ||
container.appendChild( | mainCardContainer.appendChild(buttonsContainer); | ||
container.innerHTML = ''; | |||
container.appendChild(contentWrapper); | |||
elements.overlay.style.display = 'block'; | elements.overlay.style.display = 'block'; | ||
} | } | ||
// 显示所有衍生卡牌 | // 显示所有衍生卡牌 | ||
function showAllDerivedCards(character, derivedCardsList | function showAllDerivedCards(character, derivedCardsList) { | ||
var | var overlay = document.getElementById('card-overlay'); | ||
var container = document.getElementById('card-display-container'); | |||
// 清空当前内容 | |||
container.innerHTML = ''; | |||
container.style.cssText = 'position: relative; padding: 40px; min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center;'; | |||
// 创建标题 | |||
var title = document.createElement('div'); | |||
title.style.cssText = 'color: white; font-size: 28px; font-weight: bold; margin-bottom: 30px; text-align: center;'; | |||
title.textContent = '衍生卡牌'; | |||
container.appendChild(title); | |||
// 创建卡牌容器 | |||
var cardsContainer = document.createElement('div'); | |||
cardsContainer.style.cssText = 'display: flex; flex-wrap: wrap; gap: 15px; justify-content: center; max-width: 1200px;'; | |||
// 加载所有衍生卡牌 | // 加载所有衍生卡牌 | ||
var uniqueCards = [...new Set(derivedCardsList.map(function(name) { return name.trim(); }))]; | |||
var loadedCount = 0; | var loadedCount = 0; | ||
fetchCardHTML(character, cardName | uniqueCards.forEach(function(cardName) { | ||
fetchCardHTML(character, cardName, '', function(html) { | |||
var cardWrapper = document.createElement('div'); | var cardWrapper = document.createElement('div'); | ||
cardWrapper.innerHTML = html; | cardWrapper.innerHTML = html; | ||
| 第438行: | 第486行: | ||
card.style.cursor = 'default'; | card.style.cursor = 'default'; | ||
card.onclick = null; | card.onclick = null; | ||
cardsContainer.appendChild(card); | |||
}); | }); | ||
loadedCount++; | |||
if (loadedCount === uniqueCards.length) { | |||
// 所有卡牌加载完成 | |||
} | |||
}); | }); | ||
}); | }); | ||
container.appendChild(cardsContainer); | |||
// 添加返回按钮 | |||
var backBtn = document.createElement('div'); | |||
backBtn.style.cssText = 'position: fixed; top: 20px; left: 20px; padding: 10px 20px; background: linear-gradient(135deg, #4a90e2, #357abd); color: white; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); z-index: 10001;'; | |||
backBtn.textContent = '← 返回'; | |||
backBtn.onclick = function() { | |||
closeCardDisplay(); | |||
}; | |||
container.appendChild(backBtn); | |||
} | } | ||
// | // 检查卡牌变体(优化版) | ||
function checkCardVariants(character, cardName, callback) { | function checkCardVariants(character, cardName, callback) { | ||
var variants = { lingguang: false, shenguang: false }; | var variants = { lingguang: false, shenguang: false }; | ||
var checkCount = 0; | |||
var totalChecks = 2; | |||
function checkComplete() { | |||
checkCount++; | |||
if (checkCount === totalChecks) { | |||
callback(variants); | |||
} | |||
} | |||
// | // 并行检查两种变体 | ||
fetchCardHTML(character, cardName, '灵光一闪', function(html) { | fetchCardHTML(character, cardName, '灵光一闪', function(html) { | ||
if (html && !html.includes('找不到卡组')) { | if (html && !html.includes('找不到卡组')) { | ||
variants.lingguang = true; | variants.lingguang = true; | ||
} | } | ||
checkComplete(); | |||
}); | |||
fetchCardHTML(character, cardName, '神之一闪', function(html) { | |||
if (html && !html.includes('找不到卡组')) { | |||
variants.shenguang = true; | |||
} | |||
checkComplete(); | |||
}); | }); | ||
} | } | ||
| 第471行: | 第542行: | ||
var container = document.getElementById('card-display-container'); | var container = document.getElementById('card-display-container'); | ||
// | // 重置容器样式 | ||
container.style.cssText = 'position: relative; padding: 40px; min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center;'; | |||
container.innerHTML = ''; | container.innerHTML = ''; | ||
// 创建标题 | // 创建标题 | ||
var title = document.createElement('div'); | var title = document.createElement('div'); | ||
title.style.cssText = 'color: white; font-size: | title.style.cssText = 'color: white; font-size: 28px; font-weight: bold; margin-bottom: 30px; text-align: center; background: linear-gradient(135deg, #667eea, #764ba2); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;'; | ||
title.textContent = cardName + ' - ' + variantType; | title.textContent = cardName + ' - ' + variantType; | ||
container.appendChild(title); | container.appendChild(title); | ||
// | // 创建卡牌容器(增大宽度以容纳5张卡牌) | ||
var cardsContainer = document.createElement('div'); | var cardsContainer = document.createElement('div'); | ||
cardsContainer.style.cssText = 'display: flex; flex-wrap: | cardsContainer.style.cssText = 'display: flex; flex-wrap: nowrap; gap: 15px; justify-content: center; max-width: 1200px; overflow-x: auto; padding: 20px;'; | ||
// 加载变体卡牌 | // 加载变体卡牌 | ||
| 第493行: | 第565行: | ||
card.style.cursor = 'default'; | card.style.cursor = 'default'; | ||
card.onclick = null; | card.onclick = null; | ||
card.style.flexShrink = '0'; // 防止卡牌缩小 | |||
}); | }); | ||
}); | }); | ||
| 第500行: | 第573行: | ||
// 添加返回按钮 | // 添加返回按钮 | ||
var backBtn = document.createElement('div'); | var backBtn = document.createElement('div'); | ||
backBtn.style.cssText = 'position: | backBtn.style.cssText = 'position: fixed; top: 20px; left: 20px; padding: 10px 20px; background: linear-gradient(135deg, #4a90e2, #357abd); color: white; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); z-index: 10001; transition: transform 0.2s;'; | ||
backBtn.textContent = '返回'; | backBtn.textContent = '← 返回'; | ||
backBtn.onmouseover = function() { this.style.transform = 'scale(1.05)'; }; | |||
backBtn.onmouseout = function() { this.style.transform = 'scale(1)'; }; | |||
backBtn.onclick = function() { | backBtn.onclick = function() { | ||
closeCardDisplay(); | closeCardDisplay(); | ||
// 重新显示原卡牌 | // 重新显示原卡牌 | ||
var originalCard = document.querySelector('.game-card[data-card-name="' + cardName + '"][data-character="' + character + '"]:not([data-deck-type="灵光一闪"]):not([data-deck-type="神之一闪"])'); | setTimeout(function() { | ||
var originalCard = document.querySelector('.game-card[data-card-name="' + cardName + '"][data-character="' + character + '"]:not([data-deck-type="灵光一闪"]):not([data-deck-type="神之一闪"])'); | |||
if (originalCard) { | |||
} | showEnlargedCard(originalCard); | ||
} | |||
}, 100); | |||
}; | }; | ||
container.appendChild(backBtn); | container.appendChild(backBtn); | ||
| 第524行: | 第601行: | ||
} | } | ||
}); | }); | ||
} | |||
// 添加样式优化 | |||
function addOptimizedStyles() { | |||
var style = document.createElement('style'); | |||
style.textContent = ` | |||
#card-overlay { | |||
backdrop-filter: blur(5px); | |||
-webkit-backdrop-filter: blur(5px); | |||
} | |||
#card-display-container { | |||
animation: fadeIn 0.3s ease-out; | |||
} | |||
@keyframes fadeIn { | |||
from { | |||
opacity: 0; | |||
transform: translate(-50%, -48%); | |||
} | |||
to { | |||
opacity: 1; | |||
transform: translate(-50%, -50%); | |||
} | |||
} | |||
.game-card { | |||
transition: transform 0.2s ease; | |||
} | |||
.game-card:not(#card-overlay .game-card):hover { | |||
transform: scale(1.05); | |||
z-index: 10; | |||
} | |||
/* 修复卡牌描述布局 */ | |||
#card-overlay .game-card > div:last-child { | |||
display: flex !important; | |||
align-items: center !important; | |||
justify-content: center !important; | |||
} | |||
/* 确保放大的卡牌元素正确显示 */ | |||
#card-overlay .game-card div[style*="position: absolute"] { | |||
transform-origin: center center; | |||
} | |||
/* 滚动条美化 */ | |||
#card-overlay ::-webkit-scrollbar { | |||
width: 8px; | |||
height: 8px; | |||
} | |||
#card-overlay ::-webkit-scrollbar-track { | |||
background: rgba(255, 255, 255, 0.1); | |||
border-radius: 4px; | |||
} | |||
#card-overlay ::-webkit-scrollbar-thumb { | |||
background: rgba(255, 255, 255, 0.3); | |||
border-radius: 4px; | |||
} | |||
#card-overlay ::-webkit-scrollbar-thumb:hover { | |||
background: rgba(255, 255, 255, 0.5); | |||
} | |||
`; | |||
document.head.appendChild(style); | |||
} | } | ||
// 页面加载完成后初始化 | // 页面加载完成后初始化 | ||
if (document.readyState === 'loading') { | if (document.readyState === 'loading') { | ||
document.addEventListener('DOMContentLoaded', initCardClickEvents); | document.addEventListener('DOMContentLoaded', function() { | ||
initCardClickEvents(); | |||
addOptimizedStyles(); | |||
}); | |||
} else { | } else { | ||
initCardClickEvents(); | initCardClickEvents(); | ||
addOptimizedStyles(); | |||
} | } | ||
})(); | })(); | ||
2025年9月27日 (六) 19:49的版本
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
// 切换标签
(function() {
'use strict';
function initTabSwitcher() {
var tabContainers = document.querySelectorAll('.resp-tabs');
tabContainers.forEach(function(container) {
var tabButtons = container.querySelectorAll('.czn-list-style');
if (tabButtons.length === 0) return;
// 检测模式
var tabContents = container.querySelectorAll('.resp-tab-content');
var portraitImages = document.querySelectorAll('.portrait-image');
// 初始化
tabButtons.forEach(function(button, index) {
button.classList.toggle('active', index === 0);
});
if (tabContents.length > 0) {
tabContents.forEach(function(content, index) {
content.style.display = index === 0 ? 'block' : 'none';
});
}
if (portraitImages.length > 0) {
portraitImages.forEach(function(image, index) {
image.style.display = index === 0 ? 'block' : 'none';
});
}
// 点击事件
tabButtons.forEach(function(button, index) {
button.addEventListener('click', function(e) {
e.preventDefault();
// 更新标签状态
tabButtons.forEach(function(btn, i) {
btn.classList.toggle('active', i === index);
});
// 传统模式切换
if (tabContents.length > 0) {
tabContents.forEach(function(content, i) {
content.style.display = i === index ? 'block' : 'none';
});
}
// 立绘模式切换
if (portraitImages.length > 0) {
portraitImages.forEach(function(image) {
image.style.display = 'none';
});
var targetImage = document.querySelector('.portrait-image[data-index="' + index + '"]');
if (targetImage) {
targetImage.style.display = 'block';
}
}
});
});
});
}
// 初始化
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initTabSwitcher);
} else {
initTabSwitcher();
}
})();
/* 战斗员筛选系统 */
$(function() {
if ($('#character-filter-system').length === 0) return;
// 存储当前筛选条件
var currentFilters = {
rarity: 'all',
class: 'all',
attribute: 'all',
search: ''
};
// 定义颜色
var colors = {
normal: '#6c757d',
active: '#007bff',
hover: '#0056b3',
reset: '#dc3545',
resetHover: '#c82333'
};
// 初始化统计
updateStats();
// 筛选按钮点击事件
$('.filter-btn').on('click', function() {
var filterType = $(this).data('filter');
var filterValue = $(this).data('value');
// 更新当前筛选条件
currentFilters[filterType] = filterValue;
// 更新按钮样式 - 使用内联样式
$('.filter-' + filterType.replace('attribute', 'attr')).each(function() {
$(this).css('background-color', colors.normal);
});
$(this).css('background-color', colors.active);
// 执行筛选
applyFilters();
});
// 筛选按钮悬停效果
$('.filter-btn').on('mouseenter', function() {
var currentBg = $(this).css('background-color');
$(this).data('original-bg', currentBg);
if (currentBg === 'rgb(108, 117, 125)' || currentBg === colors.normal) {
$(this).css({
'background-color': colors.hover,
'transform': 'scale(1.05)'
});
} else {
$(this).css('transform', 'scale(1.05)');
}
}).on('mouseleave', function() {
var originalBg = $(this).data('original-bg');
if (originalBg) {
$(this).css({
'background-color': originalBg,
'transform': 'scale(1)'
});
} else {
$(this).css('transform', 'scale(1)');
}
});
// 搜索框事件
$('#character-search').on('input', function() {
currentFilters.search = $(this).val().toLowerCase();
applyFilters();
});
// 重置按钮
$('#reset-filters').on('click', function() {
currentFilters = {
rarity: 'all',
class: 'all',
attribute: 'all',
search: ''
};
// 重置所有按钮样式
$('.filter-btn').css('background-color', colors.normal);
$('.filter-btn[data-value="all"]').css('background-color', colors.active);
// 清空搜索框
$('#character-search').val('');
// 显示所有角色
$('.character-card').show();
// 隐藏筛选显示
$('#current-filters').hide();
// 更新统计
updateStats();
});
// 重置按钮悬停效果
$('#reset-filters').on('mouseenter', function() {
$(this).css({
'background-color': colors.resetHover,
'transform': 'scale(1.05)'
});
}).on('mouseleave', function() {
$(this).css({
'background-color': colors.reset,
'transform': 'scale(1)'
});
});
// 应用筛选
function applyFilters() {
var hasFilter = false;
var filterText = [];
var visibleCount = 0;
$('.character-card').each(function() {
var $card = $(this);
var show = true;
// 检查稀有度
if (currentFilters.rarity !== 'all') {
if ($card.data('rarity') !== currentFilters.rarity) {
show = false;
}
hasFilter = true;
}
// 检查职业
if (currentFilters.class !== 'all') {
if ($card.data('class') !== currentFilters.class) {
show = false;
}
hasFilter = true;
}
// 检查属性
if (currentFilters.attribute !== 'all') {
if ($card.data('attribute') !== currentFilters.attribute) {
show = false;
}
hasFilter = true;
}
// 检查搜索
if (currentFilters.search !== '') {
var name = $card.data('name').toLowerCase();
if (name.indexOf(currentFilters.search) === -1) {
show = false;
}
hasFilter = true;
}
// 显示或隐藏卡片
if (show) {
$card.fadeIn(200);
visibleCount++;
} else {
$card.fadeOut(200);
}
});
// 更新筛选条件显示
if (hasFilter) {
if (currentFilters.rarity !== 'all') filterText.push('稀有度:' + currentFilters.rarity);
if (currentFilters.class !== 'all') filterText.push('职业:' + currentFilters.class);
if (currentFilters.attribute !== 'all') filterText.push('属性:' + currentFilters.attribute);
if (currentFilters.search !== '') filterText.push('搜索:' + currentFilters.search);
$('#filter-display').text(filterText.join(' | '));
$('#current-filters').show();
} else {
$('#current-filters').hide();
}
// 更新统计
updateStats();
}
// 更新统计信息
function updateStats() {
var visibleCount = $('.character-card:visible').length;
var totalCount = $('.character-card').length;
$('#visible-count').text(visibleCount);
$('#total-count').text(totalCount);
}
});
// 卡牌系统功能
(function() {
// 防止重复初始化
if (window.cardSystemInitialized) return;
window.cardSystemInitialized = true;
// 缓存DOM元素
var overlayCache = null;
var containerCache = null;
// 创建遮罩层和容器(只创建一次)
function createCardOverlay() {
if (overlayCache && containerCache) {
return { overlay: overlayCache, container: containerCache };
}
// 创建遮罩
var overlay = document.createElement('div');
overlay.id = 'card-overlay';
overlay.style.cssText = 'display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.8); z-index: 9999; overflow-y: auto;';
// 创建容器
var container = document.createElement('div');
container.id = 'card-display-container';
container.style.cssText = 'position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); min-height: 100vh; padding: 40px 20px; display: flex; align-items: center; justify-content: center;';
overlay.appendChild(container);
document.body.appendChild(overlay);
// 点击遮罩关闭
overlay.addEventListener('click', function(e) {
if (e.target === overlay) {
closeCardDisplay();
}
});
overlayCache = overlay;
containerCache = container;
return { overlay: overlay, container: container };
}
// 关闭卡牌展示
function closeCardDisplay() {
var overlay = document.getElementById('card-overlay');
if (overlay) {
overlay.style.display = 'none';
var container = overlay.querySelector('#card-display-container');
if (container) {
container.innerHTML = '';
}
}
}
// 缓存API调用结果
var apiCache = {};
// 获取卡牌HTML(通过API调用模块)
function fetchCardHTML(character, cardName, deckType, callback) {
var cacheKey = character + '|' + cardName + '|' + (deckType || '');
// 检查缓存
if (apiCache[cacheKey]) {
callback(apiCache[cacheKey]);
return;
}
var api = new mw.Api();
var wikitext = '{{#invoke:卡牌|main|' + character + '|' + cardName + '|' + (deckType || '') + '}}';
api.parse(wikitext).done(function(html) {
apiCache[cacheKey] = html; // 缓存结果
callback(html);
}).fail(function() {
callback('<div style="color: white;">加载失败</div>');
});
}
// 放大显示卡牌
function showEnlargedCard(cardElement) {
var elements = createCardOverlay();
var container = elements.container;
var cardName = cardElement.dataset.cardName;
var character = cardElement.dataset.character;
var deckType = cardElement.dataset.deckType;
var derivedCards = cardElement.dataset.derivedCards;
// 创建内容包装器
var contentWrapper = document.createElement('div');
contentWrapper.style.cssText = 'display: flex; align-items: center; gap: 20px; position: relative;';
// 创建主卡牌容器
var mainCardContainer = document.createElement('div');
mainCardContainer.style.cssText = 'position: relative; width: 336px; height: 460px; display: flex; align-items: center; justify-content: center;';
// 克隆并放大主卡牌
var enlargedCard = cardElement.cloneNode(true);
// 修复放大卡牌的样式
var cardInner = document.createElement('div');
cardInner.style.cssText = 'transform: scale(2); position: relative;';
cardInner.appendChild(enlargedCard);
// 确保卡牌正确显示
enlargedCard.style.width = '168px';
enlargedCard.style.height = '230px';
enlargedCard.style.cursor = 'default';
enlargedCard.style.position = 'relative';
enlargedCard.style.display = 'block';
enlargedCard.onclick = null;
mainCardContainer.appendChild(cardInner);
// 处理衍生卡牌
if (derivedCards && derivedCards.trim() !== '') {
var derivedCardsList = derivedCards.split('、');
// 创建左侧容器
var leftContainer = document.createElement('div');
leftContainer.style.cssText = 'display: flex; flex-direction: column; gap: 15px; align-items: flex-end;';
if (derivedCardsList.length > 1) {
// 多张衍生卡牌,添加查看所有按钮
var viewAllBtn = document.createElement('div');
viewAllBtn.style.cssText = 'padding: 10px 20px; background: linear-gradient(135deg, #4a90e2, #357abd); color: white; border-radius: 6px; cursor: pointer; white-space: nowrap; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); transition: transform 0.2s;';
viewAllBtn.textContent = '查看所有衍生卡牌';
viewAllBtn.onmouseover = function() { this.style.transform = 'scale(1.05)'; };
viewAllBtn.onmouseout = function() { this.style.transform = 'scale(1)'; };
viewAllBtn.onclick = function() {
showAllDerivedCards(character, derivedCardsList);
};
leftContainer.appendChild(viewAllBtn);
}
// 显示第一张衍生卡牌
var firstDerivedCard = document.createElement('div');
firstDerivedCard.id = 'derived-cards-display';
firstDerivedCard.style.cssText = 'display: flex; align-items: center;';
fetchCardHTML(character, derivedCardsList[0].trim(), '', function(html) {
firstDerivedCard.innerHTML = html;
var cards = firstDerivedCard.querySelectorAll('.game-card');
cards.forEach(function(card) {
card.style.cursor = 'default';
card.onclick = null;
});
});
leftContainer.appendChild(firstDerivedCard);
contentWrapper.appendChild(leftContainer);
}
contentWrapper.appendChild(mainCardContainer);
// 创建按钮容器(放在主卡牌下方)
var buttonsContainer = document.createElement('div');
buttonsContainer.style.cssText = 'position: absolute; bottom: -60px; left: 50%; transform: translateX(-50%); display: flex; gap: 15px; z-index: 10;';
// 预加载按钮,避免延迟
checkCardVariants(character, cardName, function(variants) {
if (variants.lingguang) {
var lingguangBtn = document.createElement('div');
lingguangBtn.style.cssText = 'padding: 10px 24px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); transition: transform 0.2s;';
lingguangBtn.textContent = '灵光一闪';
lingguangBtn.onmouseover = function() { this.style.transform = 'scale(1.05)'; };
lingguangBtn.onmouseout = function() { this.style.transform = 'scale(1)'; };
lingguangBtn.onclick = function() {
showVariantCards(character, cardName, '灵光一闪');
};
buttonsContainer.appendChild(lingguangBtn);
}
if (variants.shenguang) {
var shenguangBtn = document.createElement('div');
shenguangBtn.style.cssText = 'padding: 10px 24px; background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); color: white; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); transition: transform 0.2s;';
shenguangBtn.textContent = '神之一闪';
shenguangBtn.onmouseover = function() { this.style.transform = 'scale(1.05)'; };
shenguangBtn.onmouseout = function() { this.style.transform = 'scale(1)'; };
shenguangBtn.onclick = function() {
showVariantCards(character, cardName, '神之一闪');
};
buttonsContainer.appendChild(shenguangBtn);
}
});
mainCardContainer.appendChild(buttonsContainer);
container.innerHTML = '';
container.appendChild(contentWrapper);
elements.overlay.style.display = 'block';
}
// 显示所有衍生卡牌
function showAllDerivedCards(character, derivedCardsList) {
var overlay = document.getElementById('card-overlay');
var container = document.getElementById('card-display-container');
// 清空当前内容
container.innerHTML = '';
container.style.cssText = 'position: relative; padding: 40px; min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center;';
// 创建标题
var title = document.createElement('div');
title.style.cssText = 'color: white; font-size: 28px; font-weight: bold; margin-bottom: 30px; text-align: center;';
title.textContent = '衍生卡牌';
container.appendChild(title);
// 创建卡牌容器
var cardsContainer = document.createElement('div');
cardsContainer.style.cssText = 'display: flex; flex-wrap: wrap; gap: 15px; justify-content: center; max-width: 1200px;';
// 加载所有衍生卡牌
var uniqueCards = [...new Set(derivedCardsList.map(function(name) { return name.trim(); }))];
var loadedCount = 0;
uniqueCards.forEach(function(cardName) {
fetchCardHTML(character, cardName, '', function(html) {
var cardWrapper = document.createElement('div');
cardWrapper.innerHTML = html;
var cards = cardWrapper.querySelectorAll('.game-card');
cards.forEach(function(card) {
card.style.cursor = 'default';
card.onclick = null;
cardsContainer.appendChild(card);
});
loadedCount++;
if (loadedCount === uniqueCards.length) {
// 所有卡牌加载完成
}
});
});
container.appendChild(cardsContainer);
// 添加返回按钮
var backBtn = document.createElement('div');
backBtn.style.cssText = 'position: fixed; top: 20px; left: 20px; padding: 10px 20px; background: linear-gradient(135deg, #4a90e2, #357abd); color: white; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); z-index: 10001;';
backBtn.textContent = '← 返回';
backBtn.onclick = function() {
closeCardDisplay();
};
container.appendChild(backBtn);
}
// 检查卡牌变体(优化版)
function checkCardVariants(character, cardName, callback) {
var variants = { lingguang: false, shenguang: false };
var checkCount = 0;
var totalChecks = 2;
function checkComplete() {
checkCount++;
if (checkCount === totalChecks) {
callback(variants);
}
}
// 并行检查两种变体
fetchCardHTML(character, cardName, '灵光一闪', function(html) {
if (html && !html.includes('找不到卡组')) {
variants.lingguang = true;
}
checkComplete();
});
fetchCardHTML(character, cardName, '神之一闪', function(html) {
if (html && !html.includes('找不到卡组')) {
variants.shenguang = true;
}
checkComplete();
});
}
// 显示变体卡牌
function showVariantCards(character, cardName, variantType) {
var overlay = document.getElementById('card-overlay');
var container = document.getElementById('card-display-container');
// 重置容器样式
container.style.cssText = 'position: relative; padding: 40px; min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center;';
container.innerHTML = '';
// 创建标题
var title = document.createElement('div');
title.style.cssText = 'color: white; font-size: 28px; font-weight: bold; margin-bottom: 30px; text-align: center; background: linear-gradient(135deg, #667eea, #764ba2); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;';
title.textContent = cardName + ' - ' + variantType;
container.appendChild(title);
// 创建卡牌容器(增大宽度以容纳5张卡牌)
var cardsContainer = document.createElement('div');
cardsContainer.style.cssText = 'display: flex; flex-wrap: nowrap; gap: 15px; justify-content: center; max-width: 1200px; overflow-x: auto; padding: 20px;';
// 加载变体卡牌
fetchCardHTML(character, cardName, variantType, function(html) {
cardsContainer.innerHTML = html;
// 移除所有卡牌的点击事件
var cards = cardsContainer.querySelectorAll('.game-card');
cards.forEach(function(card) {
card.style.cursor = 'default';
card.onclick = null;
card.style.flexShrink = '0'; // 防止卡牌缩小
});
});
container.appendChild(cardsContainer);
// 添加返回按钮
var backBtn = document.createElement('div');
backBtn.style.cssText = 'position: fixed; top: 20px; left: 20px; padding: 10px 20px; background: linear-gradient(135deg, #4a90e2, #357abd); color: white; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 2px 8px rgba(0,0,0,0.3); z-index: 10001; transition: transform 0.2s;';
backBtn.textContent = '← 返回';
backBtn.onmouseover = function() { this.style.transform = 'scale(1.05)'; };
backBtn.onmouseout = function() { this.style.transform = 'scale(1)'; };
backBtn.onclick = function() {
closeCardDisplay();
// 重新显示原卡牌
setTimeout(function() {
var originalCard = document.querySelector('.game-card[data-card-name="' + cardName + '"][data-character="' + character + '"]:not([data-deck-type="灵光一闪"]):not([data-deck-type="神之一闪"])');
if (originalCard) {
showEnlargedCard(originalCard);
}
}, 100);
};
container.appendChild(backBtn);
}
// 初始化卡牌点击事件
function initCardClickEvents() {
// 使用事件委托
document.addEventListener('click', function(e) {
var card = e.target.closest('.game-card');
if (card && !card.closest('#card-overlay')) {
e.preventDefault();
e.stopPropagation();
showEnlargedCard(card);
}
});
}
// 添加样式优化
function addOptimizedStyles() {
var style = document.createElement('style');
style.textContent = `
#card-overlay {
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
}
#card-display-container {
animation: fadeIn 0.3s ease-out;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translate(-50%, -48%);
}
to {
opacity: 1;
transform: translate(-50%, -50%);
}
}
.game-card {
transition: transform 0.2s ease;
}
.game-card:not(#card-overlay .game-card):hover {
transform: scale(1.05);
z-index: 10;
}
/* 修复卡牌描述布局 */
#card-overlay .game-card > div:last-child {
display: flex !important;
align-items: center !important;
justify-content: center !important;
}
/* 确保放大的卡牌元素正确显示 */
#card-overlay .game-card div[style*="position: absolute"] {
transform-origin: center center;
}
/* 滚动条美化 */
#card-overlay ::-webkit-scrollbar {
width: 8px;
height: 8px;
}
#card-overlay ::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
#card-overlay ::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.3);
border-radius: 4px;
}
#card-overlay ::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.5);
}
`;
document.head.appendChild(style);
}
// 页面加载完成后初始化
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
initCardClickEvents();
addOptimizedStyles();
});
} else {
initCardClickEvents();
addOptimizedStyles();
}
})();