Skip to content

Commit 76b0426

Browse files
Merge pull request #72 from simpleanalytics/codex/add-callback-to-sa_pageview
Add callback support to sa_pageview
2 parents cfdd6f6 + 3ac0008 commit 76b0426

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-30; bf05; v12) */
1+
/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; 8325; v12) */
22
/* eslint-env browser */
33

44
(function (
@@ -662,21 +662,25 @@
662662
isPushState,
663663
deleteSourceInfo,
664664
sameSite,
665-
metadata
665+
metadata,
666+
callback
666667
) {
667668
if (isPushState) sendOnLeave("" + payload.page_id, trueVar);
668669
if (collectDataOnLeave) payload.page_id = uuid();
669670

670671
var currentPage = definedHostname + getPath();
671672

672-
sendData({
673-
id: payload.page_id,
674-
type: pageviewText,
675-
referrer: !deleteSourceInfo || sameSite ? referrer : null,
676-
query: getQueryParams(deleteSourceInfo),
673+
sendData(
674+
{
675+
id: payload.page_id,
676+
type: pageviewText,
677+
referrer: !deleteSourceInfo || sameSite ? referrer : null,
678+
query: getQueryParams(deleteSourceInfo),
677679

678-
metadata: stringify(metadata),
679-
});
680+
metadata: stringify(metadata),
681+
},
682+
callback
683+
);
680684

681685
previousReferrer = referrer;
682686
referrer = currentPage;
@@ -686,7 +690,14 @@
686690

687691
var sameSite, userNavigated;
688692

689-
var pageview = function (isPushState, pathOverwrite, metadata) {
693+
var pageview = function (
694+
isPushState,
695+
pathOverwrite,
696+
metadata,
697+
callbackRaw
698+
) {
699+
if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;
700+
var callback = isFunction(callbackRaw) ? callbackRaw : function () {};
690701
// Obfuscate personal data in URL by dropping the search and hash
691702
var path = getPath(pathOverwrite);
692703

@@ -765,7 +776,8 @@
765776
isPushState,
766777
isPushState || userNavigated || !collectMetricByString("r"), // r = referrers
767778
sameSite,
768-
metadata
779+
metadata,
780+
callback
769781
);
770782
};
771783

@@ -856,8 +868,8 @@
856868

857869
if (autoCollect) pageview();
858870

859-
window.sa_pageview = function (path, metadata) {
860-
pageview(0, path, metadata);
871+
window.sa_pageview = function (path, metadata, callback) {
872+
pageview(0, path, metadata, callback);
861873
};
862874

863875

src/default.js

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -750,23 +750,27 @@
750750
isPushState,
751751
deleteSourceInfo,
752752
sameSite,
753-
metadata
753+
metadata,
754+
callback
754755
) {
755756
if (isPushState) sendOnLeave("" + payload.page_id, trueVar);
756757
if (collectDataOnLeave) payload.page_id = uuid();
757758

758759
var currentPage = definedHostname + getPath();
759760

760-
sendData({
761-
id: payload.page_id,
762-
type: pageviewText,
763-
referrer: !deleteSourceInfo || sameSite ? referrer : null,
764-
query: getQueryParams(deleteSourceInfo),
765-
766-
/** if metadata **/
767-
metadata: stringify(metadata),
768-
/** endif **/
769-
});
761+
sendData(
762+
{
763+
id: payload.page_id,
764+
type: pageviewText,
765+
referrer: !deleteSourceInfo || sameSite ? referrer : null,
766+
query: getQueryParams(deleteSourceInfo),
767+
768+
/** if metadata **/
769+
metadata: stringify(metadata),
770+
/** endif **/
771+
},
772+
callback
773+
);
770774

771775
previousReferrer = referrer;
772776
referrer = currentPage;
@@ -776,7 +780,14 @@
776780

777781
var sameSite, userNavigated;
778782

779-
var pageview = function (isPushState, pathOverwrite, metadata) {
783+
var pageview = function (
784+
isPushState,
785+
pathOverwrite,
786+
metadata,
787+
callbackRaw
788+
) {
789+
if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;
790+
var callback = isFunction(callbackRaw) ? callbackRaw : function () {};
780791
// Obfuscate personal data in URL by dropping the search and hash
781792
var path = getPath(pathOverwrite);
782793

@@ -869,7 +880,8 @@
869880
isPushState,
870881
isPushState || userNavigated || !collectMetricByString("r"), // r = referrers
871882
sameSite,
872-
metadata
883+
metadata,
884+
callback
873885
);
874886
};
875887

@@ -966,12 +978,12 @@
966978
if (autoCollect) pageview();
967979

968980
/** if metadata **/
969-
window.sa_pageview = function (path, metadata) {
970-
pageview(0, path, metadata);
981+
window.sa_pageview = function (path, metadata, callback) {
982+
pageview(0, path, metadata, callback);
971983
};
972984
/** else **/
973-
window.sa_pageview = function (path) {
974-
pageview(0, path);
985+
window.sa_pageview = function (path, callback) {
986+
pageview(0, path, undefinedVar, callback);
975987
};
976988
/** endif **/
977989

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)