82 lines
2.1 KiB
HTML
82 lines
2.1 KiB
HTML
<!-- TRACKING SCRIPT -->
|
|
<!-- To be placed in the header -->
|
|
<!-- Global server config -->
|
|
<script>
|
|
const server = window.location.origin;
|
|
|
|
// const server = "https://tracking.server.com"
|
|
// This will work, but is NOT recommended as it is with third party request.
|
|
|
|
</script>
|
|
|
|
<!-- Tracking function -->
|
|
<script>
|
|
// Initialize tracking function
|
|
function tE(eventName, additionalParams = {}) {
|
|
// Create tracking data object
|
|
const data = {
|
|
event: eventName,
|
|
url: window.location.href,
|
|
ref: document.referrer,
|
|
ua: navigator.userAgent,
|
|
sw: window.screen.width,
|
|
lang: navigator.language || navigator.userLanguage,
|
|
};
|
|
|
|
// Helper function to serialize an object into URL parameters
|
|
function serializeObject(obj, prefix) {
|
|
const str = [];
|
|
for (const p in obj) {
|
|
if (obj.hasOwnProperty(p)) {
|
|
const k = prefix ? prefix + "[" + p + "]" : p;
|
|
const v = obj[p];
|
|
if (v !== null && typeof v === "object") {
|
|
str.push(serializeObject(v, k));
|
|
} else {
|
|
str.push(encodeURIComponent(k) + "=" + encodeURIComponent(v));
|
|
}
|
|
}
|
|
}
|
|
return str.join("&");
|
|
}
|
|
|
|
function sendT() {
|
|
try {
|
|
const trackingUrl = `${server}/spur?${serializeObject(data)}`;
|
|
fetch(trackingUrl, {
|
|
method: "POST",
|
|
mode: "no-cors",
|
|
cache: "no-cache",
|
|
credentials: "omit", // Don't send cookies
|
|
keepalive: true, // Ensures request completes even if page unloads
|
|
});
|
|
|
|
return true;
|
|
} catch (e) {
|
|
// Last resort fallback to image method
|
|
const pixel = new Image();
|
|
pixel.src = `${server}/pic?${serializeObject(data)}`;
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return sendT();
|
|
}
|
|
// Simple Wrapper for pageLoad.
|
|
function pL() {
|
|
tE("pageLoad_" + window.location.pathname);
|
|
}
|
|
</script>
|
|
|
|
<!-- Set up page load tracking -->
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
try {
|
|
pL();
|
|
} catch (error) {
|
|
console.error("Error in DOMContentLoaded:", error);
|
|
}
|
|
});
|
|
</script>
|