main.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // main.js - 前端增强脚本
  2. document.addEventListener("DOMContentLoaded", function () {
  3. // 卡片悬停效果(桌面端)
  4. const cards = document.querySelectorAll(".card");
  5. cards.forEach((card) => {
  6. card.addEventListener("mouseenter", function () {
  7. this.style.transform = "translateY(-4px)";
  8. });
  9. card.addEventListener("mouseleave", function () {
  10. this.style.transform = "translateY(0)";
  11. });
  12. });
  13. // 图片懒加载(浏览器原生支持,这里作为后备)
  14. if ("loading" in HTMLImageElement.prototype) {
  15. const images = document.querySelectorAll('img[loading="lazy"]');
  16. images.forEach((img) => {
  17. img.src = img.src; // 触发加载
  18. });
  19. } else {
  20. // 降级方案:使用 IntersectionObserver
  21. const lazyImages = document.querySelectorAll('img[loading="lazy"]');
  22. if ("IntersectionObserver" in window) {
  23. const observer = new IntersectionObserver((entries) => {
  24. entries.forEach((entry) => {
  25. if (entry.isIntersecting) {
  26. const img = entry.target;
  27. img.src = img.dataset.src || img.src;
  28. observer.unobserve(img);
  29. }
  30. });
  31. });
  32. lazyImages.forEach((img) => observer.observe(img));
  33. }
  34. }
  35. // 删除确认弹窗(已在模板中使用 confirm,这里作为补充)
  36. const deleteForms = document.querySelectorAll('form[action*="delete"]');
  37. deleteForms.forEach((form) => {
  38. form.addEventListener("submit", function (e) {
  39. if (!confirm("确定要删除吗?此操作不可恢复。")) {
  40. e.preventDefault();
  41. }
  42. });
  43. });
  44. });