diff --git a/analytics/client/dist/w.js b/analytics/client/dist/w.js index 372e02b..0c14882 100644 --- a/analytics/client/dist/w.js +++ b/analytics/client/dist/w.js @@ -220,7 +220,10 @@ function main() { if (navTimer || !counting()) return; navTimer = setTimeout(safe(function () { navTimer = null; - if (counting() && cleanPath(WIN.location.pathname) !== lastPath) sendPv(false); + if (!counting() || cleanPath(WIN.location.pathname) === lastPath) return; + // SPA-Seitenwechsel (Router mit preventDefault, onLinkClick greift dann nicht): en der vorigen Seite zuerst + sendEn(); + sendPv(false); }), 300); } let hooksOn = false; diff --git a/analytics/client/w.js b/analytics/client/w.js index d66925d..6e5e299 100644 --- a/analytics/client/w.js +++ b/analytics/client/w.js @@ -90,7 +90,10 @@ function main() { if (navTimer || !counting()) return; navTimer = setTimeout(safe(function () { navTimer = null; - if (counting() && cleanPath(WIN.location.pathname) !== lastPath) sendPv(false); + if (!counting() || cleanPath(WIN.location.pathname) === lastPath) return; + // SPA-Seitenwechsel (Router mit preventDefault, onLinkClick greift dann nicht): en der vorigen Seite zuerst + sendEn(); + sendPv(false); }), 300); } let hooksOn = false; diff --git a/analytics/test/client.test.js b/analytics/test/client.test.js index a14fbce..24b5acd 100644 --- a/analytics/test/client.test.js +++ b/analytics/test/client.test.js @@ -565,7 +565,9 @@ test('w.js: SPA-pv bei akzeptierter Einwilligung; nach Widerruf kein en', () => const h = harness({ stored: { v: 1, a: 'accept', bv: BV, t: 1_700_000_000_000 - 1000 } }); h.win.location.pathname = '/zwei'; h.history.pushState(null, '', '/zwei'); h.timers.splice(0).forEach((f) => f()); - assert.deepEqual(h.sent.map((s) => s.d.path), ['/start', '/zwei']); + // en der vorigen Seite vor dem pv der neuen (Router-Links verhindern den Standard-Klick, onLinkClick greift nicht) + assert.deepEqual(h.sent.map((s) => `${s.d.t}:${s.d.path}`), ['pv:/start', 'en:/start', 'pv:/zwei']); + assert.equal(h.sent[1].d.scroll, 55); h.ck(target()); assert.equal(h.sent.at(-1).d.path, '/zwei'); h.store['wk-consent'] = JSON.stringify({ v: 1, a: 'reject', bv: BV, t: 1_700_000_000_000 }); @@ -688,3 +690,20 @@ test('w.js: unbekannte Variante => Kunden-Fassung', () => { const p = findAll(hostEl(h).shadow, (n) => n.tagName === 'P')[0]; assert.ok(p.textContent.startsWith(BANNER_TEXT)); }); + +test('w.js: SPA-Wechsel ohne Einwilligung sendet nur pv, kein en', () => { + const h = harness(); + h.win.location.pathname = '/zwei'; + h.history.pushState(null, '', '/zwei'); h.timers.splice(0).forEach((f) => f()); + assert.deepEqual(h.types(), ['pv', 'bn:shown', 'pv']); +}); + +test('w.js: en nach SPA-Wechsel nur einmal je Seite (Link-Klick und Router)', () => { + const h = harness({ stored: { v: 1, a: 'accept', bv: BV, t: 1_700_000_000_000 - 1000 } }); + h.leave(); + h.win.location.pathname = '/zwei'; + h.history.pushState(null, '', '/zwei'); h.timers.splice(0).forEach((f) => f()); + assert.deepEqual(h.sent.map((s) => `${s.d.t}:${s.d.path}`), ['pv:/start', 'en:/start', 'pv:/zwei']); + h.leave(); + assert.deepEqual(h.sent.map((s) => `${s.d.t}:${s.d.path}`).slice(-1), ['en:/zwei']); +});