| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import _ from 'lodash'
- import * as eventTracking from '../../infrastructure/event-tracking'
- function isInViewport(element) {
- const elTop = $(element).offset().top
- const elBtm = elTop + $(element).outerHeight()
- const viewportTop = $(window).scrollTop()
- const viewportBtm = viewportTop + $(window).height()
- return elBtm > viewportTop && elTop < viewportBtm
- }
- function setupEventTracking(el) {
- const key = el.getAttribute('event-tracking')
- const action = el.getAttribute('event-tracking-action') || key
- const label = el.getAttribute('event-tracking-label') || ''
- const gaCategory = el.getAttribute('event-tracking-ga')
- const sendMB = el.getAttribute('event-tracking-mb')
- const trigger = el.getAttribute('event-tracking-trigger')
- const sendOnce = el.getAttribute('event-tracking-send-once')
- const element = el.getAttribute('event-tracking-element')
- const segmentation = JSON.parse(el.getAttribute('event-segmentation') || '{}')
- segmentation.page = window.location.pathname
- function submit() {
- if (element === 'checkbox') {
- segmentation.checkbox = el.checked ? 'checked' : 'unchecked'
- } else if (element === 'select') {
- segmentation.selectValue = el.value
- }
- if (sendMB) {
- if (sendOnce) {
- eventTracking.sendMBOnce(key, segmentation)
- } else {
- eventTracking.sendMB(key, segmentation)
- }
- }
- if (gaCategory) {
- if (sendOnce) {
- eventTracking.sendOnce(gaCategory, action, label)
- } else {
- eventTracking.send(gaCategory, action, label)
- }
- }
- }
- let handler
- let timer
- let timeoutAmt = 500
- switch (trigger) {
- case 'load':
- submit()
- break
- case 'click':
- el.addEventListener('click', () => submit())
- break
- case 'hover':
- if (el.getAttribute('event-hover-amt')) {
- timeoutAmt = parseInt(el.getAttribute('event-hover-amt'), 10)
- }
- el.addEventListener('mouseenter', () => {
- timer = setTimeout(() => submit(), timeoutAmt)
- })
- el.addEventListener('mouseleave', () => clearTimeout(timer))
- break
- case 'scroll':
- handler = _.throttle(() => {
- if (isInViewport(el)) {
- submit()
- window.removeEventListener('scroll', handler)
- window.removeEventListener('resize', handler)
- }
- }, 500)
- window.addEventListener('scroll', handler)
- window.addEventListener('resize', handler)
- break
- }
- }
- document.querySelectorAll('[event-tracking]').forEach(setupEventTracking)
|