From c4cf788d68d33d6938a43d15c55ad9ae81f0b6d5 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Thu, 22 Oct 2020 15:17:18 -0700 Subject: [PATCH 1/2] Send navigate events to Hydro (#16160) * Send navigate events to Hydro * Use event delegation on links --- javascripts/events.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/javascripts/events.js b/javascripts/events.js index 5ec354024275..8b80ff2b6c66 100644 --- a/javascripts/events.js +++ b/javascripts/events.js @@ -170,6 +170,26 @@ export default async function initializeEvents () { page_render_duration: render }) + // Navigate event + Array.from( + document.querySelectorAll('.sidebar-products details') + ).forEach(details => details.addEventListener( + 'toggle', + evt => sendEvent({ + type: 'navigate', + navigate_label: `details ${evt.target.open ? 'open' : 'close'}: ${evt.target.querySelector('summary').innerText}` + }) + )) + + document.querySelector('.sidebar-products').addEventListener('click', evt => { + const link = evt.target.closest('a') + if (!link) return + sendEvent({ + type: 'navigate', + navigate_label: `link: ${link.href}` + }) + }) + // Exit event pageEventId = pageEvent?.context?.event_id window.addEventListener('scroll', trackScroll) From c3bff7f26c3b66d44fbd3fe6592490df68157c36 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Thu, 22 Oct 2020 15:26:11 -0700 Subject: [PATCH 2/2] Trigger event when user clicks external link (#16156) * Trigger event when user clicks external link * Use event delegation for link events --- javascripts/events.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/javascripts/events.js b/javascripts/events.js index 8b80ff2b6c66..27a9d9b2548f 100644 --- a/javascripts/events.js +++ b/javascripts/events.js @@ -27,7 +27,7 @@ export function getUserEventsId () { return cookieValue } -export async function sendEvent ({ +export function sendEvent ({ type, version = '1.0.0', page_render_duration, @@ -141,7 +141,7 @@ function trackScroll () { if (scrollPosition > maxScrollY) maxScrollY = scrollPosition } -async function sendExit () { +function sendExit () { if (sentExit) return if (document.visibilityState !== 'hidden') return if (!pageEventId) return @@ -162,14 +162,24 @@ async function sendExit () { }) } -export default async function initializeEvents () { +export default function initializeEvents () { // Page event const { render } = getPerformance() - const pageEvent = await sendEvent({ + const pageEvent = sendEvent({ type: 'page', page_render_duration: render }) + // Link event + document.documentElement.addEventListener('click', evt => { + const link = evt.target.closest('a[href^="http"]') + if (!link) return + sendEvent({ + type: 'link', + link_url: link.href + }) + }) + // Navigate event Array.from( document.querySelectorAll('.sidebar-products details')