class LinkBuildingTracker { constructor() { this.trackingData = JSON.parse(localStorage.getItem('linkTrackingData')) || {}; this.init(); } init() { // Traccia i click sui link esterni document.addEventListener('click', (e) => { const link = e.target.closest('a'); if (link && this.isExternalLink(link.href)) { this.trackClick(link.href, 'click'); } }); // Traccia le impression (quando un link entra nella viewport) this.trackImpressions(); // Salva i dati periodicamente setInterval(() => this.saveData(), 30000); } isExternalLink(url) { try { const domain = new URL(url).hostname; return domain !== window.location.hostname; } catch { return false; } } trackClick(url, type = 'click') { const domain = new URL(url).hostname; if (!this.trackingData[domain]) { this.trackingData[domain] = { clicks: 0, impressions: 0, lastInteraction: new Date().toISOString(), urls: {} }; } if (!this.trackingData[domain].urls[url]) { this.trackingData[domain].urls[url] = { clicks: 0, impressions: 0, firstSeen: new Date().toISOString() }; } this.trackingData[domain].urls[url].clicks++; this.trackingData[domain].clicks++; this.trackingData[domain].lastInteraction = new Date().toISOString(); console.log(`Tracked ${type} on: ${url}`); } trackImpressions() { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const link = entry.target; if (this.isExternalLink(link.href)) { this.trackImpression(link.href); } } }); }, { threshold: 0.1 }); // Osserva tutti i link esterni document.querySelectorAll('a[href^="http"]').forEach(link => { if (this.isExternalLink(link.href)) { observer.observe(link); } }); } trackImpression(url) { const domain = new URL(url).hostname; if (!this.trackingData[domain]) { this.trackingData[domain] = { clicks: 0, impressions: 0, lastInteraction: new Date().toISOString(), urls: {} }; } if (!this.trackingData[domain].urls[url]) { this.trackingData[domain].urls[url] = { clicks: 0, impressions: 0, firstSeen: new Date().toISOString() }; } this.trackingData[domain].urls[url].impressions++; this.trackingData[domain].impressions++; } saveData() { localStorage.setItem('linkTrackingData', JSON.stringify(this.trackingData)); } getReport() { return this.trackingData; } exportData() { return JSON.stringify(this.trackingData, null, 2); } } // Inizializzazione const linkTracker = new LinkBuildingTracker();