diff --git a/packages/js/bundle.min.js b/packages/js/bundle.min.js index 384255b8..e132967d 100644 --- a/packages/js/bundle.min.js +++ b/packages/js/bundle.min.js @@ -1 +1 @@ -var MatomoTracker=function(t){"use strict";var i=function(){return(i=Object.assign||function(t){for(var e,r=1,o=arguments.length;r +
+ + +
+ diff --git a/packages/js/src/MatomoTracker.ts b/packages/js/src/MatomoTracker.ts index e3fe803d..6de5b3cd 100644 --- a/packages/js/src/MatomoTracker.ts +++ b/packages/js/src/MatomoTracker.ts @@ -13,6 +13,8 @@ import { } from './types' class MatomoTracker { + mutationObserver?: MutationObserver + constructor(userOptions: UserOptions) { const options = { ...defaultOptions, ...userOptions } if (!options.urlBase) { @@ -78,11 +80,7 @@ class MatomoTracker { window._paq.push(['enableLinkTracking', active]) } - // Tracks events based on data attributes - trackEvents() { - const elements = Array.from( - document.querySelectorAll('[data-matomo-event="click"]'), - ) + private trackEventsForElements(elements: HTMLElement[]) { if (elements.length) { elements.forEach((element) => { element.addEventListener('click', () => { @@ -109,6 +107,49 @@ class MatomoTracker { } } + // Tracks events based on data attributes + trackEvents() { + const matchString = '[data-matomo-event="click"]' + let firstTime = false + if (!this.mutationObserver) { + firstTime = true + this.mutationObserver = new MutationObserver((mutations) => { + for (const mutation of mutations) { + // Iterate over NodeList by indices (es15 does not allow using 'let node of mutation.addedNodes') + mutation.addedNodes.forEach((node) => { + // only track HTML elements + if (!(node instanceof HTMLElement)) return + + // check the inserted element for being a code snippet + if (node.matches(matchString)) { + this.trackEventsForElements([node]) + } + + const elements = Array.from( + node.querySelectorAll(matchString), + ) + this.trackEventsForElements(elements) + }) + } + }) + } + this.mutationObserver.observe(document, { childList: true, subtree: true }) + + // Now track all already existing elements + if (firstTime) { + const elements = Array.from( + document.querySelectorAll(matchString), + ) + this.trackEventsForElements(elements) + } + } + + stopObserving() { + if (this.mutationObserver) { + this.mutationObserver.disconnect() + } + } + // Tracks events // https://matomo.org/docs/event-tracking/#tracking-events trackEvent({ diff --git a/packages/react/src/types.ts b/packages/react/src/types.ts index e0ddab36..598c5ad4 100644 --- a/packages/react/src/types.ts +++ b/packages/react/src/types.ts @@ -2,6 +2,7 @@ import { types } from '@datapunt/matomo-tracker-js' export interface MatomoInstance { trackEvent?: Function + trackEvents?: Function trackPageView?: Function trackSiteSearch?: Function trackLink?: Function diff --git a/packages/react/src/useMatomo.ts b/packages/react/src/useMatomo.ts index 59a22e3e..591d1996 100644 --- a/packages/react/src/useMatomo.ts +++ b/packages/react/src/useMatomo.ts @@ -18,6 +18,8 @@ function useMatomo() { const trackEvent = (params: TrackEventParams) => instance.trackEvent && instance.trackEvent(params) + const trackEvents = () => instance.trackEvents && instance.trackEvents() + const trackSiteSearch = (params: TrackSiteSearchParams) => instance.trackSiteSearch && instance.trackSiteSearch(params) @@ -28,6 +30,7 @@ function useMatomo() { return { trackEvent, + trackEvents, trackPageView, trackSiteSearch, trackLink,