Skip to content
This repository was archived by the owner on Oct 21, 2024. It is now read-only.

Commit c37ea89

Browse files
bernardosrulzonmhadam
authored andcommitted
Tracking click events on forms (close snowplow#579)
1 parent b86bcbd commit c37ea89

3 files changed

Lines changed: 42 additions & 7 deletions

File tree

core/lib/core.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -818,7 +818,7 @@ export function trackerCore(base64: boolean, callback?: (PayloadData) => void) {
818818
},
819819

820820
/**
821-
* Track the value of a form field changing
821+
* Track the value of a form field changing or receiving focus
822822
*
823823
* @param formId The parent form ID
824824
* @param elementId ID of the changed element
@@ -832,7 +832,8 @@ export function trackerCore(base64: boolean, callback?: (PayloadData) => void) {
832832
*
833833
* @todo make `nodeName` enum
834834
*/
835-
trackFormChange: function (
835+
trackFormFocusOrChange: function (
836+
schema: string,
836837
formId: string,
837838
elementId: string,
838839
nodeName: string,
@@ -843,7 +844,7 @@ export function trackerCore(base64: boolean, callback?: (PayloadData) => void) {
843844
tstamp?: Timestamp): PayloadData {
844845

845846
return trackSelfDescribingEvent({
846-
schema: 'iglu:com.snowplowanalytics.snowplow/change_form/jsonschema/1-0-0',
847+
schema: 'iglu:com.snowplowanalytics.snowplow/' + schema + '/jsonschema/1-0-0',
847848
data: removeEmptyProperties({
848849
formId: formId,
849850
elementId: elementId,

core/tests/unit/core.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,37 @@ define([
400400
compare(tracker.trackRemoveFromCart(sku, name, category, unitPrice, quantity, currency), expected);
401401
},
402402

403+
"Track a form focus event": function () {
404+
var formId = "parent";
405+
var elementId = "child";
406+
var nodeName = "INPUT";
407+
var type = "text";
408+
var elementClasses = ["important"];
409+
var value = "male";
410+
411+
var inputJson = {
412+
schema: 'iglu:com.snowplowanalytics.snowplow/focus_form/jsonschema/1-0-0',
413+
data: {
414+
formId: formId,
415+
elementId: elementId,
416+
nodeName: nodeName,
417+
type: type,
418+
elementClasses: elementClasses,
419+
value: value
420+
}
421+
};
422+
423+
var expected = {
424+
e: 'ue',
425+
ue_pr: JSON.stringify({
426+
schema: unstructEventSchema,
427+
data: inputJson
428+
})
429+
};
430+
431+
compare(tracker.trackFormFocusOrChange('focus_form', formId, elementId, nodeName, type, elementClasses, value), expected);
432+
},
433+
403434
"Track a form change event": function () {
404435
var formId = "parent";
405436
var elementId = "child";
@@ -428,7 +459,7 @@ define([
428459
})
429460
};
430461

431-
compare(tracker.trackFormChange(formId, elementId, nodeName, type, elementClasses, value), expected);
462+
compare(tracker.trackFormFocusOrChange('change_form', formId, elementId, nodeName, type, elementClasses, value), expected);
432463
},
433464

434465
"Track a form submission event": function () {

src/js/forms.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,14 @@ object.getFormTrackingManager = function (core, trackerId, contextAdder) {
124124
/*
125125
* Return function to handle form field change event
126126
*/
127-
function getFormChangeListener(context) {
127+
function getFormChangeListener(event_type, context) {
128128
return function (e) {
129129
var elt = e.target;
130130
var type = (elt.nodeName && elt.nodeName.toUpperCase() === 'INPUT') ? elt.type : null;
131131
var value = (elt.type === 'checkbox' && !elt.checked) ? null : fieldTransform(elt.value);
132-
core.trackFormChange(getParentFormName(elt), getFormElementName(elt), elt.nodeName, type, helpers.getCssClasses(elt), value, contextAdder(context));
132+
if (event_type === 'change_form' || (type !== 'checkbox' && type !== 'radio')) {
133+
core.trackFormFocusOrChange(event_type, getParentFormName(elt), getFormElementName(elt), elt.nodeName, type, helpers.getCssClasses(elt), value, contextAdder(context));
134+
}
133135
};
134136
}
135137

@@ -171,7 +173,8 @@ object.getFormTrackingManager = function (core, trackerId, contextAdder) {
171173
forEach(innerElementTags, function (tagname) {
172174
forEach(form.getElementsByTagName(tagname), function (innerElement) {
173175
if (fieldFilter(innerElement) && !innerElement[trackingMarker] && innerElement.type.toLowerCase() !== 'password') {
174-
helpers.addEventListener(innerElement, 'change', getFormChangeListener(context), false);
176+
helpers.addEventListener(innerElement, 'focus', getFormChangeListener('focus_form', context), false);
177+
helpers.addEventListener(innerElement, 'change', getFormChangeListener('change_form', context), false);
175178
innerElement[trackingMarker] = true;
176179
}
177180
});

0 commit comments

Comments
 (0)