Skip to content

Commit 7dc389f

Browse files
committed
Add callback support to sa_pageview
1 parent e38d8f6 commit 7dc389f

File tree

4 files changed

+89
-31
lines changed

4 files changed

+89
-31
lines changed

dist/latest/auto-events.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/latest/latest.dev.js

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 36a5; v12) */
1+
/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; 8325; v12) */
22
/* eslint-env browser */
33

44
(function (
@@ -656,21 +656,25 @@
656656
isPushState,
657657
deleteSourceInfo,
658658
sameSite,
659-
metadata
659+
metadata,
660+
callback
660661
) {
661662
if (isPushState) sendOnLeave("" + payload.page_id, trueVar);
662663
if (collectDataOnLeave) payload.page_id = uuid();
663664

664665
var currentPage = definedHostname + getPath();
665666

666-
sendData({
667-
id: payload.page_id,
668-
type: pageviewText,
669-
referrer: !deleteSourceInfo || sameSite ? referrer : null,
670-
query: getQueryParams(deleteSourceInfo),
667+
sendData(
668+
{
669+
id: payload.page_id,
670+
type: pageviewText,
671+
referrer: !deleteSourceInfo || sameSite ? referrer : null,
672+
query: getQueryParams(deleteSourceInfo),
671673

672-
metadata: stringify(metadata),
673-
});
674+
metadata: stringify(metadata),
675+
},
676+
callback
677+
);
674678

675679
previousReferrer = referrer;
676680
referrer = currentPage;
@@ -680,7 +684,14 @@
680684

681685
var sameSite, userNavigated;
682686

683-
var pageview = function (isPushState, pathOverwrite, metadata) {
687+
var pageview = function (
688+
isPushState,
689+
pathOverwrite,
690+
metadata,
691+
callbackRaw
692+
) {
693+
if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;
694+
var callback = isFunction(callbackRaw) ? callbackRaw : function () {};
684695
// Obfuscate personal data in URL by dropping the search and hash
685696
var path = getPath(pathOverwrite);
686697

@@ -759,7 +770,8 @@
759770
isPushState,
760771
isPushState || userNavigated || !collectMetricByString("r"), // r = referrers
761772
sameSite,
762-
metadata
773+
metadata,
774+
callback
763775
);
764776
};
765777

@@ -850,8 +862,8 @@
850862

851863
if (autoCollect) pageview();
852864

853-
window.sa_pageview = function (path, metadata) {
854-
pageview(0, path, metadata);
865+
window.sa_pageview = function (path, metadata, callback) {
866+
pageview(0, path, metadata, callback);
855867
};
856868

857869

src/default.js

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -745,23 +745,27 @@
745745
isPushState,
746746
deleteSourceInfo,
747747
sameSite,
748-
metadata
748+
metadata,
749+
callback
749750
) {
750751
if (isPushState) sendOnLeave("" + payload.page_id, trueVar);
751752
if (collectDataOnLeave) payload.page_id = uuid();
752753

753754
var currentPage = definedHostname + getPath();
754755

755-
sendData({
756-
id: payload.page_id,
757-
type: pageviewText,
758-
referrer: !deleteSourceInfo || sameSite ? referrer : null,
759-
query: getQueryParams(deleteSourceInfo),
760-
761-
/** if metadata **/
762-
metadata: stringify(metadata),
763-
/** endif **/
764-
});
756+
sendData(
757+
{
758+
id: payload.page_id,
759+
type: pageviewText,
760+
referrer: !deleteSourceInfo || sameSite ? referrer : null,
761+
query: getQueryParams(deleteSourceInfo),
762+
763+
/** if metadata **/
764+
metadata: stringify(metadata),
765+
/** endif **/
766+
},
767+
callback
768+
);
765769

766770
previousReferrer = referrer;
767771
referrer = currentPage;
@@ -771,7 +775,14 @@
771775

772776
var sameSite, userNavigated;
773777

774-
var pageview = function (isPushState, pathOverwrite, metadata) {
778+
var pageview = function (
779+
isPushState,
780+
pathOverwrite,
781+
metadata,
782+
callbackRaw
783+
) {
784+
if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;
785+
var callback = isFunction(callbackRaw) ? callbackRaw : function () {};
775786
// Obfuscate personal data in URL by dropping the search and hash
776787
var path = getPath(pathOverwrite);
777788

@@ -864,7 +875,8 @@
864875
isPushState,
865876
isPushState || userNavigated || !collectMetricByString("r"), // r = referrers
866877
sameSite,
867-
metadata
878+
metadata,
879+
callback
868880
);
869881
};
870882

@@ -961,12 +973,12 @@
961973
if (autoCollect) pageview();
962974

963975
/** if metadata **/
964-
window.sa_pageview = function (path, metadata) {
965-
pageview(0, path, metadata);
976+
window.sa_pageview = function (path, metadata, callback) {
977+
pageview(0, path, metadata, callback);
966978
};
967979
/** else **/
968-
window.sa_pageview = function (path) {
969-
pageview(0, path);
980+
window.sa_pageview = function (path, callback) {
981+
pageview(0, path, undefinedVar, callback);
970982
};
971983
/** endif **/
972984

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const { expect } = require("chai");
2+
const { createDOM } = require("./helpers/dom");
3+
4+
describe("pageview callback", function () {
5+
it("executes callback after sending a pageview", function (done) {
6+
const dom = createDOM({ settings: { autoCollect: false } });
7+
8+
const sent = dom.sent;
9+
dom.window.Image = function () {
10+
return {
11+
onload: null,
12+
onerror: null,
13+
set src(value) {
14+
sent.push({ type: "image", url: value });
15+
if (this.onload) this.onload();
16+
},
17+
};
18+
};
19+
20+
let called = false;
21+
dom.window.sa_pageview("/callback", function () {
22+
called = true;
23+
});
24+
25+
setTimeout(() => {
26+
const req = dom.sent.find(
27+
(r) => r.type === "image" && /path=%2Fcallback/.test(r.url)
28+
);
29+
expect(req, "pageview request").to.exist;
30+
expect(called, "callback called").to.be.true;
31+
done();
32+
}, 10);
33+
});
34+
});

0 commit comments

Comments
 (0)