term-tooltip.old.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /**
  2. * <span
  3. class="term-ref"
  4. data-id="b45e7b10-2b75-4f5f-ac63-be686116043c"
  5. data-term="anicca"
  6. >
  7. 无常
  8. </span>
  9. */
  10. document.addEventListener("DOMContentLoaded", () => {
  11. const cache = {};
  12. const drawerEl = document.getElementById("termDrawer");
  13. const drawer = new bootstrap.Offcanvas(drawerEl);
  14. const drawerTitle = document.getElementById("termDrawerTitle");
  15. const drawerBody = document.getElementById("termDrawerBody");
  16. function isMobile() {
  17. return window.innerWidth < 768;
  18. }
  19. async function fetchTerm(term) {
  20. if (cache[term]) return cache[term];
  21. console.info("term", term);
  22. const res = await fetch(`/api/v2/terms/${term}`);
  23. const data = await res.json();
  24. cache[term] = data.data;
  25. return data.data;
  26. }
  27. document.querySelectorAll(".term-ref").forEach((el) => {
  28. let popover = null;
  29. el.addEventListener("mouseenter", async () => {
  30. console.info("mouseenter");
  31. if (isMobile()) return;
  32. if (popover) return;
  33. const pali = el.dataset.term;
  34. const data = await fetchTerm(el.dataset.id);
  35. popover = new bootstrap.Popover(el, {
  36. trigger: "manual",
  37. html: true,
  38. placement: "bottom",
  39. content: `
  40. <div style="max-width:300px">
  41. <h4>${data.word}</h4>
  42. <div>${data.summary}</div>
  43. </div>
  44. `,
  45. });
  46. popover.show();
  47. });
  48. el.addEventListener("mouseleave", () => {
  49. if (popover) {
  50. popover.dispose();
  51. popover = null;
  52. }
  53. });
  54. el.addEventListener("click", async () => {
  55. if (!isMobile()) return;
  56. const data = await fetchTerm(el.dataset.id);
  57. drawerTitle.innerHTML = data.word;
  58. drawerBody.innerHTML = data.summary;
  59. drawer.show();
  60. });
  61. });
  62. });