index.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 element = el.getAttribute('event-tracking-element')
  19. const segmentation = JSON.parse(el.getAttribute('event-segmentation') || '{}')
  20. segmentation.page = window.location.pathname
  21. function submit() {
  22. if (element === 'checkbox') {
  23. segmentation.checkbox = el.checked ? 'checked' : 'unchecked'
  24. } else if (element === 'select') {
  25. segmentation.selectValue = el.value
  26. }
  27. if (sendMB) {
  28. if (sendOnce) {
  29. eventTracking.sendMBOnce(key, segmentation)
  30. } else {
  31. eventTracking.sendMB(key, segmentation)
  32. }
  33. }
  34. if (gaCategory) {
  35. if (sendOnce) {
  36. eventTracking.sendOnce(gaCategory, action, label)
  37. } else {
  38. eventTracking.send(gaCategory, action, label)
  39. }
  40. }
  41. }
  42. let handler
  43. let timer
  44. let timeoutAmt = 500
  45. switch (trigger) {
  46. case 'load':
  47. submit()
  48. break
  49. case 'click':
  50. el.addEventListener('click', () => submit())
  51. break
  52. case 'hover':
  53. if (el.getAttribute('event-hover-amt')) {
  54. timeoutAmt = parseInt(el.getAttribute('event-hover-amt'), 10)
  55. }
  56. el.addEventListener('mouseenter', () => {
  57. timer = setTimeout(() => submit(), timeoutAmt)
  58. })
  59. el.addEventListener('mouseleave', () => clearTimeout(timer))
  60. break
  61. case 'scroll':
  62. handler = _.throttle(() => {
  63. if (isInViewport(el)) {
  64. submit()
  65. window.removeEventListener('scroll', handler)
  66. window.removeEventListener('resize', handler)
  67. }
  68. }, 500)
  69. window.addEventListener('scroll', handler)
  70. window.addEventListener('resize', handler)
  71. break
  72. }
  73. }
  74. document.querySelectorAll('[event-tracking]').forEach(setupEventTracking)