Files
AcdiuTools/wwwroot/js/theme-switcher.js
2026-04-25 17:04:42 +08:00

69 lines
2.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 主题切换逻辑
* 依赖: Bootstrap 5.3+ (用于 data-bs-theme 和 Tooltip)
*/
document.addEventListener('DOMContentLoaded', function () {
const toggleBtn = document.getElementById('theme-toggle-btn');
if (!toggleBtn) return;
const htmlElement = document.documentElement;
// 初始化 Bootstrap Tooltip
const tooltip = new bootstrap.Tooltip(toggleBtn);
/**
* 更新按钮的图标和提示文字
* @param {string} theme - 'light' or 'dark'
*/
function updateButtonUI(theme) {
const iconContainer = toggleBtn.querySelector('i');
if (!iconContainer) return;
if (theme === 'dark') {
// 当前是深色,按钮显示“太阳”,提示“切换到浅色”
iconContainer.className = 'bi bi-sun-fill';
toggleBtn.setAttribute('data-bs-original-title', '切换到浅色模式');
} else {
// 当前是浅色,按钮显示“月亮”,提示“切换到深色”
iconContainer.className = 'bi bi-moon-stars-fill';
toggleBtn.setAttribute('data-bs-original-title', '切换到深色模式');
}
// 刷新 Tooltip 显示
tooltip.setContent({ '.tooltip-inner': toggleBtn.getAttribute('data-bs-original-title') });
}
// 初始更新 UI (确保图标与后端传来的 ViewBag.CurrentTheme 一致)
// 注意data-bs-theme 已经在 HTML 根节点由 Razor 设置
const initialTheme = htmlElement.getAttribute('data-bs-theme') || 'light';
updateButtonUI(initialTheme);
// 点击事件处理
toggleBtn.addEventListener('click', function () {
const currentTheme = htmlElement.getAttribute('data-bs-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
// 1. 立即更新 UI (无刷新)
htmlElement.setAttribute('data-bs-theme', newTheme);
updateButtonUI(newTheme);
tooltip.show(); // 可选:点击时短暂显示提示
setTimeout(() => tooltip.hide(), 1000);
// 2. 异步持久化到后端
fetch('/Home/SetTheme', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
// 如果需要 AntiForgery Token请确保页面中有表单或手动注入
// 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]')?.value
},
body: JSON.stringify({ theme: newTheme })
})
.then(response => {
if (!response.ok) {
console.error('Failed to save theme preference');
}
})
.catch(error => console.error('Error:', error));
});
});