Skills › Marketing Skills › conversion-tracking › jotform.js
jotform.js
30 lines · skills/conversion-tracking/assets/snippets/jotform.js at 88c79f6
1/*! Jotform conversion detection (MIT)
2 * Detects: form submission. Pushes dataLayer event: jotform_form_submitted
3 * From the conversion-tracking skill in Marketing Skills */
4/* Jotform iframe completion listener. Reads no form answers.
5 * Counts once per embedded frame on this page. */
6(function () {
7 'use strict';
8 if (window.__ctDetectJotform || window.__ctJotformMethod2Installed) return;
9 window.__ctDetectJotform = true;
10 window.__ctJotformMethod2Installed = true;
11 var completed = [];
12 window.addEventListener('message', function (event) {
13 if (!event.source || event.source === window) return;
14 if (!/^https:\/\/(form|submit)\.jotform\.com$/.test(event.origin)) return;
15 var data = event.data;
16 if (!data || typeof data !== 'object' || Array.isArray(data) || data.action !== 'submission-completed') return;
17 var frames = document.querySelectorAll('iframe');
18 for (var i = 0; i < frames.length; i++) {
19 var frame = frames[i];
20 if (frame.contentWindow !== event.source) continue;
21 var match = /^https:\/\/form\.jotform\.com\/(\d+)(?:[/?#]|$)/.exec(frame.getAttribute('src') || '');
22 if (!match || (data.formID != null && String(data.formID) !== match[1])) return;
23 if (completed.indexOf(frame) !== -1) return;
24 completed.push(frame);
25 window.dataLayer = window.dataLayer || [];
26 window.dataLayer.push({ event: 'jotform_form_submitted', form_id: match[1] });
27 return;
28 }
29 });
30})();