main.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // main.js - 前端增强脚本
  2. document.addEventListener("DOMContentLoaded", function () {
  3. // 图片懒加载(浏览器原生支持,这里作为后备)
  4. if ("loading" in HTMLImageElement.prototype) {
  5. const images = document.querySelectorAll('img[loading="lazy"]');
  6. images.forEach((img) => {
  7. img.src = img.src; // 触发加载
  8. });
  9. } else {
  10. // 降级方案:使用 IntersectionObserver
  11. const lazyImages = document.querySelectorAll('img[loading="lazy"]');
  12. if ("IntersectionObserver" in window) {
  13. const observer = new IntersectionObserver((entries) => {
  14. entries.forEach((entry) => {
  15. if (entry.isIntersecting) {
  16. const img = entry.target;
  17. img.src = img.dataset.src || img.src;
  18. observer.unobserve(img);
  19. }
  20. });
  21. });
  22. lazyImages.forEach((img) => observer.observe(img));
  23. }
  24. }
  25. // 删除确认弹窗(已在模板中使用 confirm,这里作为补充)
  26. const deleteForms = document.querySelectorAll('form[action*="delete"]');
  27. deleteForms.forEach((form) => {
  28. form.addEventListener("submit", function (e) {
  29. if (!confirm("确定要删除吗?此操作不可恢复。")) {
  30. e.preventDefault();
  31. }
  32. });
  33. });
  34. // 固定“下一篇文章”按钮功能(仅首页存在)
  35. const nextBtn = document.getElementById('nextArticleBtn');
  36. if (nextBtn) {
  37. nextBtn.addEventListener('click', function () {
  38. const cards = document.querySelectorAll('.card');
  39. if (!cards.length) return;
  40. // 找到第一个顶部在视口下方(或刚好可见)的卡片
  41. for (const card of cards) {
  42. const rect = card.getBoundingClientRect();
  43. if (rect.top >= 1) {
  44. card.scrollIntoView({ behavior: 'smooth', block: 'start' });
  45. return;
  46. }
  47. }
  48. // 没有在下方可见的卡片,滚动到最后一篇
  49. cards[cards.length - 1].scrollIntoView({ behavior: 'smooth', block: 'start' });
  50. });
  51. }
  52. });