Skills › Marketing Skills › conversion-tracking › ws-form.js
ws-form.js
55 lines · skills/conversion-tracking/assets/snippets/ws-form.js at 88c79f6
1/*! WS Form conversion detection (MIT)
2 * Detects: form submission. Pushes dataLayer event: ws_form_submitted
3 * From the conversion-tracking skill in Marketing Skills */
4(function () {
5 if (window.__ctDetectWsForm) return;
6 window.__ctDetectWsForm = true;
7 window.dataLayer = window.dataLayer || [];
8 var seenEvents = typeof WeakSet === 'function' ? new WeakSet() : null;
9 var lastSuccessByInstance = {};
10 function unwrap(value) { return value && value.jquery ? value[0] : (value && value[0] && value[0].nodeType ? value[0] : value); }
11 function onAcceptedSubmit(event, formObject, formId, instanceId, formEl) {
12 if (event && seenEvents) {
13 if (seenEvents.has(event)) return;
14 seenEvents.add(event);
15 }
16 var form = unwrap(formEl);
17 if (!form || !form.matches || !form.matches('form.wsf-form')) return;
18 var id;
19 if (typeof formId === 'string') {
20 if (!/^\d+$/.test(formId) || Number(formId) < 1) return;
21 id = formId;
22 } else if (typeof formId === 'number') {
23 if (!isFinite(formId) || Math.floor(formId) !== formId || formId < 1) return;
24 id = String(formId);
25 } else {
26 return;
27 }
28 // WS Form can finish both requests from a double-click. Count the rapid
29 // success callbacks once, without changing the form or reading answers.
30 var instance = typeof instanceId === 'string' || typeof instanceId === 'number' ? instanceId : '';
31 var key = id + ':' + instance;
32 var now = Date.now();
33 if (lastSuccessByInstance[key] !== undefined && now - lastSuccessByInstance[key] < 2000) return;
34 lastSuccessByInstance[key] = now;
35 var adapter = window.__ctWsFormMethod2Emit;
36 if (typeof adapter === 'function') {
37 try { if (adapter(form, id, instanceId) === true) return; }
38 catch (e) { return; }
39 }
40 window.dataLayer.push({ event: 'ws_form_submitted', form_id: id });
41 }
42 var handlerBound = false;
43 function hook() {
44 if (handlerBound) return true;
45 var jq = typeof jQuery !== 'undefined' ? jQuery : (typeof $ !== 'undefined' ? $ : null);
46 if (!jq) return false;
47 jq(document).on('wsf-submit-success', onAcceptedSubmit);
48 handlerBound = true;
49 return true;
50 }
51 if (!hook()) {
52 document.addEventListener('DOMContentLoaded', hook, { once: true });
53 window.addEventListener('load', hook, { once: true });
54 }
55})();