From 39a7fd249de366e9dc7d9eba0a37705a212859e1 Mon Sep 17 00:00:00 2001 From: Danny van Kooten Date: Wed, 10 Oct 2018 10:57:45 +0200 Subject: [PATCH] re-use img.onload and use timeout as failsafe to always remove img from DOM. #148 --- assets/src/js/tracker.js | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/assets/src/js/tracker.js b/assets/src/js/tracker.js index 6cfdcc0..82854e1 100644 --- a/assets/src/js/tracker.js +++ b/assets/src/js/tracker.js @@ -156,9 +156,9 @@ function trackPageview() { }; let url = config.trackerUrl || findTrackerUrl() - let i = document.createElement('img'); - i.src = url + stringifyObject(d); - i.addEventListener('load', function() { + let img = document.createElement('img'); + img.src = url + stringifyObject(d); + img.addEventListener('load', function() { let now = new Date(); let midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 24, 0, 0); @@ -171,9 +171,23 @@ function trackPageview() { data.isNewSession = false; data.lastSeen = +new Date(); setCookie('_fathom', JSON.stringify(data), { expires: midnight, path: '/' }); + + // remove tracking img from DOM + document.body.removeChild(img) }); - i.addEventListener('load', () => document.body.removeChild(i)); - document.body.appendChild(i); + + // in case img.onload never fires, remove img after 1s & reset src attribute to cancel request + window.setTimeout(() => { + if(!img.parentNode) { + return; + } + + img.src = ''; + document.body.removeChild(img) + }, 1000); + + // add to DOM to fire request + document.body.appendChild(img); } // override global fathom object