Skip to content
This repository has been archived by the owner on Jan 30, 2023. It is now read-only.

Commit

Permalink
Extension for trackEvents() using an MutationObserver. (#167)
Browse files Browse the repository at this point in the history
Added MutationObserver to MatomoTracker
Added dynamically adding buttons to example (test MutationObserver)
Exposed trackEvents function to useMatomo
  • Loading branch information
geier1993 committed May 30, 2020
1 parent 8740384 commit 79e9692
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 6 deletions.
2 changes: 1 addition & 1 deletion packages/js/bundle.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions packages/js/example/index.html
Expand Up @@ -27,6 +27,15 @@
Track me!
</button>

</br>

<button
onclick="addDynamicButton()"
>
Add dynamic button
</button>
<div id="buttonContainer"></div>

<script src="../bundle.min.js"></script>
<script>
const MatomoInstance = new window.MatomoTracker.default({
Expand All @@ -35,6 +44,21 @@
})

MatomoInstance.trackEvents()

var buttonNum = 0
function addDynamicButton(data) {
buttonNum += 1
var button = document.createElement("button");
button.setAttribute("data-matomo-event", "click")
button.setAttribute("data-matomo-category", "sample-page")
button.setAttribute("data-matomo-action", "click-event")
button.setAttribute("data-matomo-name", "testDynamicButton")
button.setAttribute("data-matomo-value", buttonNum)
button.innerHTML = `Track Event ${buttonNum}`;

var buttonContainer = document.getElementById("buttonContainer");
buttonContainer.appendChild(button);
}
</script>
</body>
</html>
51 changes: 46 additions & 5 deletions packages/js/src/MatomoTracker.ts
Expand Up @@ -13,6 +13,8 @@ import {
} from './types'

class MatomoTracker {
mutationObserver?: MutationObserver

constructor(userOptions: UserOptions) {
const options = { ...defaultOptions, ...userOptions }
if (!options.urlBase) {
Expand Down Expand Up @@ -78,11 +80,7 @@ class MatomoTracker {
window._paq.push(['enableLinkTracking', active])
}

// Tracks events based on data attributes
trackEvents() {
const elements = Array.from(
document.querySelectorAll<HTMLElement>('[data-matomo-event="click"]'),
)
private trackEventsForElements(elements: HTMLElement[]) {
if (elements.length) {
elements.forEach((element) => {
element.addEventListener('click', () => {
Expand All @@ -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<HTMLElement>(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<HTMLElement>(matchString),
)
this.trackEventsForElements(elements)
}
}

stopObserving() {
if (this.mutationObserver) {
this.mutationObserver.disconnect()
}
}

// Tracks events
// https://matomo.org/docs/event-tracking/#tracking-events
trackEvent({
Expand Down
1 change: 1 addition & 0 deletions packages/react/src/types.ts
Expand Up @@ -2,6 +2,7 @@ import { types } from '@datapunt/matomo-tracker-js'

export interface MatomoInstance {
trackEvent?: Function
trackEvents?: Function
trackPageView?: Function
trackSiteSearch?: Function
trackLink?: Function
Expand Down
3 changes: 3 additions & 0 deletions packages/react/src/useMatomo.ts
Expand Up @@ -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)

Expand All @@ -28,6 +30,7 @@ function useMatomo() {

return {
trackEvent,
trackEvents,
trackPageView,
trackSiteSearch,
trackLink,
Expand Down

0 comments on commit 79e9692

Please sign in to comment.