2025-09-15 00:15:37 +08:00

178 lines
6.4 KiB
JavaScript

// 全局JavaScript功能
document.addEventListener('DOMContentLoaded', function() {
// 自动隐藏提示消息
const alerts = document.querySelectorAll('.alert');
alerts.forEach(function(alert) {
setTimeout(function() {
alert.style.opacity = '0';
setTimeout(function() {
alert.style.display = 'none';
}, 300);
}, 5000); // 5秒后自动隐藏
});
// 平滑滚动
const links = document.querySelectorAll('a[href^="#"]');
links.forEach(function(link) {
link.addEventListener('click', function(e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// 表单验证增强
const forms = document.querySelectorAll('form');
forms.forEach(function(form) {
form.addEventListener('submit', function(e) {
const submitBtn = form.querySelector('button[type="submit"]');
if (submitBtn && !submitBtn.disabled) {
// 防止重复提交
setTimeout(function() {
submitBtn.disabled = true;
}, 100);
}
});
});
// 输入框焦点效果
const inputs = document.querySelectorAll('.form-control');
inputs.forEach(function(input) {
input.addEventListener('focus', function() {
this.parentNode.classList.add('focused');
});
input.addEventListener('blur', function() {
this.parentNode.classList.remove('focused');
});
});
// 工具提示初始化
if (typeof bootstrap !== 'undefined') {
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
tooltipTriggerList.map(function(tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
// 弹出框初始化
const popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'));
popoverTriggerList.map(function(popoverTriggerEl) {
return new bootstrap.Popover(popoverTriggerEl);
});
}
// 邮箱验证码倒计时功能
window.startVerificationCountdown = function(buttonId, duration = 60) {
const button = document.getElementById(buttonId);
if (!button) return;
let count = duration;
const originalText = button.textContent;
button.disabled = true;
const timer = setInterval(function() {
button.textContent = `${count}秒后重试`;
count--;
if (count < 0) {
clearInterval(timer);
button.disabled = false;
button.textContent = originalText === '发送验证码' ? '重新发送' : originalText;
}
}, 1000);
return timer;
};
// AJAX请求封装
window.sendAjaxRequest = function(url, data, successCallback, errorCallback) {
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => {
if (data.success) {
if (successCallback) successCallback(data);
} else {
if (errorCallback) errorCallback(data.message || '请求失败');
}
})
.catch(error => {
console.error('请求错误:', error);
if (errorCallback) errorCallback('网络错误,请检查连接');
});
};
// 显示加载状态
window.showLoading = function(button, loadingText = '处理中...') {
if (!button) return;
button.disabled = true;
const originalHTML = button.innerHTML;
button.innerHTML = `<i class="fas fa-spinner fa-spin me-2"></i>${loadingText}`;
return function() {
button.disabled = false;
button.innerHTML = originalHTML;
};
};
// 显示消息提示
window.showMessage = function(message, type = 'info') {
const alertContainer = document.querySelector('.container');
if (!alertContainer) return;
const alertDiv = document.createElement('div');
alertDiv.className = `alert alert-${type} alert-dismissible fade show`;
alertDiv.innerHTML = `
<i class="fas fa-${type === 'error' ? 'exclamation-triangle' : type === 'success' ? 'check-circle' : 'info-circle'} me-2"></i>
${message}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
`;
alertContainer.insertBefore(alertDiv, alertContainer.firstChild);
// 自动隐藏
setTimeout(function() {
alertDiv.style.opacity = '0';
setTimeout(function() {
if (alertDiv.parentNode) {
alertDiv.parentNode.removeChild(alertDiv);
}
}, 300);
}, 5000);
};
// 验证邮箱格式
window.validateEmail = function(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
};
// 验证密码强度
window.validatePassword = function(password) {
if (password.length < 6) {
return { valid: false, message: '密码长度至少6位' };
}
return { valid: true, message: '密码强度可以' };
};
// 数字输入限制
window.restrictToNumbers = function(inputElement) {
inputElement.addEventListener('input', function(e) {
e.target.value = e.target.value.replace(/[^0-9]/g, '');
});
};
// 初始化数字验证码输入框
const codeInputs = document.querySelectorAll('input[name="verification_code"]');
codeInputs.forEach(function(input) {
window.restrictToNumbers(input);
});
});
// 全局错误处理
window.addEventListener('error', function(e) {
console.error('全局错误:', e.error);
});
// 全局未处理的Promise拒绝
window.addEventListener('unhandledrejection', function(e) {
console.error('未处理的Promise拒绝:', e.reason);
});