(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-WC8MBVF7'); // 'gtm_relay' CustomEvent surfaces beyond shadow DOM. window.addEventListener('gtm_relay', function (e) { window.dataLayer.push(e.detail); }, false); // Single-page application consumes virtual pageview. window.addEventListener('pushstate', function (e) { window.dataLayer.push({ event: 'virtual_page_view', page_location: e.target.document.URL }); }, false); (function() { // Set to the event you want to track var eventName = 'click'; // Set to false if you don't want to use capture phase var useCapture = true; // Set to false if you want to track all events and not just those in shadow DOM var trackOnlyShadowDom = false; var callback = function(event) { if ('composed' in event && typeof event.composedPath === 'function') { // Get the path of elements the event climbed through, e.g. // [span, div, div, section, body] var path = event.composedPath(); // Fetch reference to the element that was actually clicked var targetElement; if(path.length < 1) { return; } // The element clicked is guaranteed to be the first element // in the list of the composed path targetElement = path[0]; // Check if the element is WITHIN the shadow DOM (ignoring the root) var shadowFound = path.length ? path.filter(function(i) { return !targetElement.shadowRoot && !!i.shadowRoot; }).length > 0 : false; // If only shadow DOM events should be tracked and the element is not within one, return if (trackOnlyShadowDom && !shadowFound) return; const analyticElement = targetElement.closest('[data-analytics-id]'); // Push to dataLayer if(analyticElement){ window.dataLayer.push({ event: 'ui_click', 'gtm.element': analyticElement, 'gtm.elementId': analyticElement.id || '', 'gtm.elementClasses': analyticElement.className || '', 'gtm.elementUrl': analyticElement.href || analyticElement.action || '', 'gtm.elementText': analyticElement.textContent || '', 'gtm.elementAnalyticsId': analyticElement.dataset.analyticsId || '', 'gtm.elementTarget': analyticElement.target || '', 'gtm.originalEvent': event, inShadowDom: shadowFound }); } } }; document.addEventListener(eventName, callback, useCapture); })();