script.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /**
  2. * 全局工具函数
  3. */
  4. class AppUtilities {
  5. constructor() {
  6. this.init();
  7. }
  8. /**
  9. * 初始化应用工具
  10. */
  11. init() {
  12. // 处理时间显示
  13. this.setupTimeDisplay();
  14. // 为所有表单添加验证
  15. this.setupFormValidation();
  16. // 设置日志自动滚动
  17. this.setupLogAutoScroll();
  18. }
  19. /**
  20. * 设置日志自动滚动到底部
  21. */
  22. setupLogAutoScroll() {
  23. const logElement = document.getElementById('app-logs');
  24. if (logElement) {
  25. // 创建一个MutationObserver来监听日志内容变化
  26. const observer = new MutationObserver((mutations) => {
  27. mutations.forEach((mutation) => {
  28. if (mutation.type === 'childList' || mutation.type === 'characterData') {
  29. // 滚动到底部
  30. logElement.scrollTop = logElement.scrollHeight;
  31. }
  32. });
  33. });
  34. // 配置观察者
  35. const config = {
  36. childList: true,
  37. characterData: true,
  38. subtree: true
  39. };
  40. // 开始观察
  41. observer.observe(logElement, config);
  42. }
  43. }
  44. /**
  45. * 设置时间显示和更新
  46. */
  47. setupTimeDisplay() {
  48. const timeElements = document.querySelectorAll('.current-time');
  49. if (timeElements.length) {
  50. this.updateTime();
  51. setInterval(() => this.updateTime(), 60000); // 每分钟更新一次
  52. }
  53. }
  54. /**
  55. * 更新时间函数
  56. */
  57. updateTime() {
  58. const now = new Date();
  59. const formattedTime = now.toLocaleString('zh-CN', {
  60. year: 'numeric',
  61. month: '2-digit',
  62. day: '2-digit',
  63. hour: '2-digit',
  64. minute: '2-digit'
  65. });
  66. document.querySelectorAll('.current-time').forEach(el => {
  67. el.textContent = formattedTime;
  68. });
  69. }
  70. /**
  71. * 表单验证设置
  72. */
  73. setupFormValidation() {
  74. document.querySelectorAll('form').forEach(form => {
  75. form.addEventListener('submit', (e) => {
  76. if (!this.validateForm(form.id)) {
  77. e.preventDefault();
  78. alert('请填写所有必填字段');
  79. }
  80. });
  81. });
  82. }
  83. /**
  84. * 表单验证工具
  85. * @param {string} formId - 表单ID
  86. * @returns {boolean} - 表单是否有效
  87. */
  88. validateForm(formId) {
  89. const form = document.getElementById(formId);
  90. if (!form) return true;
  91. const requiredFields = form.querySelectorAll('[required]');
  92. let isValid = true;
  93. requiredFields.forEach(field => {
  94. if (!field.value.trim()) {
  95. isValid = false;
  96. field.classList.add('invalid');
  97. setTimeout(() => {
  98. field.classList.remove('invalid');
  99. }, 2000);
  100. }
  101. });
  102. return isValid;
  103. }
  104. }
  105. // 添加全局的错误提示样式
  106. const style = document.createElement('style');
  107. style.textContent = `
  108. .invalid {
  109. border-color: #e74c3c !important;
  110. animation: shake 0.5s;
  111. }
  112. @keyframes shake {
  113. 0%, 100% { transform: translateX(0); }
  114. 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
  115. 20%, 40%, 60%, 80% { transform: translateX(5px); }
  116. }
  117. `;
  118. document.head.appendChild(style);
  119. // 页面加载完成后初始化应用工具
  120. document.addEventListener('DOMContentLoaded', () => {
  121. const appUtils = new AppUtilities();
  122. window.appUtils = appUtils; // 暴露到全局,方便其他脚本使用
  123. });