index.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import _ from 'lodash'
  2. import * as eventTracking from '../../infrastructure/event-tracking'
  3. function isInViewport(element) {
  4. const elTop = $(element).offset().top
  5. const elBtm = elTop + $(element).outerHeight()
  6. const viewportTop = $(window).scrollTop()
  7. const viewportBtm = viewportTop + $(window).height()
  8. return elBtm > viewportTop && elTop < viewportBtm
  9. }
  10. function setupEventTracking(el) {
  11. const key = el.getAttribute('event-tracking')
  12. const action = el.getAttribute('event-tracking-action') || key
  13. const label = el.getAttribute('event-tracking-label') || ''
  14. const gaCategory = el.getAttribute('event-tracking-ga')
  15. const sendMB = el.getAttribute('event-tracking-mb')
  16. const trigger = el.getAttribute('event-tracking-trigger')
  17. const sendOnce = el.getAttribute('event-tracking-send-once')
  18. const segmentation = JSON.parse(el.getAttribute('event-segmentation') || '{}')
  19. segmentation.page = window.location.pathname
  20. function submit() {
  21. if (sendMB) {
  22. if (sendOnce) {
  23. eventTracking.sendMBOnce(key, segmentation)
  24. } else {
  25. eventTracking.sendMB(key, segmentation)
  26. }
  27. }
  28. if (gaCategory) {
  29. if (sendOnce) {
  30. eventTracking.sendOnce(gaCategory, action, label)
  31. } else {
  32. eventTracking.send(gaCategory, action, label)
  33. }
  34. }
  35. }
  36. let handler
  37. let timer
  38. let timeoutAmt = 500
  39. switch (trigger) {
  40. case 'load':
  41. submit()
  42. break
  43. case 'click':
  44. el.addEventListener('click', () => submit())
  45. break
  46. case 'hover':
  47. if (el.getAttribute('event-hover-amt')) {
  48. timeoutAmt = parseInt(el.getAttribute('event-hover-amt'), 10)
  49. }
  50. el.addEventListener('mouseenter', () => {
  51. timer = setTimeout(() => submit(), timeoutAmt)
  52. })
  53. el.addEventListener('mouseleave', () => clearTimeout(timer))
  54. break
  55. case 'scroll':
  56. handler = _.throttle(() => {
  57. if (isInViewport(el)) {
  58. submit()
  59. window.removeEventListener('scroll', handler)
  60. window.removeEventListener('resize', handler)
  61. }
  62. }, 500)
  63. window.addEventListener('scroll', handler)
  64. window.addEventListener('resize', handler)
  65. break
  66. }
  67. }
  68. document.querySelectorAll('[event-tracking]').forEach(setupEventTracking)