links.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. export function whenThisLinkIsClicked(el, callback) {
  2. el.addEventListener('click', e => {
  3. e.preventDefault()
  4. callback(el)
  5. })
  6. }
  7. export function whenThisLinkIsPressed(el, callback) {
  8. el.addEventListener('click', e => e.preventDefault())
  9. el.addEventListener('mousedown', e => {
  10. e.preventDefault()
  11. callback((whenReleased) => {
  12. let handler = e => {
  13. e.preventDefault()
  14. whenReleased()
  15. el.removeEventListener('mouseup', handler)
  16. }
  17. el.addEventListener('mouseup', handler)
  18. })
  19. })
  20. }
  21. export function whenThisLinkIsHoveredFor(el, ms = 60, callback) {
  22. el.addEventListener('mouseenter', e => {
  23. let timeout = setTimeout(() => {
  24. callback(e)
  25. }, ms)
  26. let handler = () => {
  27. clearTimeout(timeout)
  28. el.removeEventListener('mouseleave', handler)
  29. }
  30. el.addEventListener('mouseleave', handler)
  31. })
  32. }
  33. export function extractDestinationFromLink(linkEl) {
  34. return createUrlObjectFromString(linkEl.getAttribute('href'))
  35. }
  36. export function createUrlObjectFromString(urlString) {
  37. return new URL(urlString, document.baseURI)
  38. }
  39. let handleLinkClick = () => {}
  40. let handleLinkHover = () => {}
  41. export function whenALinkIsClicked(callback) {
  42. handleLinkClick = callback
  43. initializeLinksForClicking()
  44. }
  45. export function whenALinkIsHovered(callback) {
  46. handleLinkHover = callback
  47. initializeLinksForHovering()
  48. }
  49. export function extractDestinationFromLink(linkEl) {
  50. return new URL(linkEl.getAttribute('href'), document.baseURI)
  51. }
  52. export function hijackNewLinksOnThePage() {
  53. initializeLinksForClicking()
  54. initializeLinksForHovering()
  55. }
  56. function initializeLinksForClicking() {
  57. getLinks().forEach(el => {
  58. el.addEventListener('click', e => {
  59. e.preventDefault()
  60. handleLinkClick(el)
  61. }