Skills › Marketing Skills › conversion-tracking › elementor-forms.js
elementor-forms.js
52 lines · skills/conversion-tracking/assets/snippets/elementor-forms.js at 88c79f6
1/*! Elementor Forms conversion detection (MIT)
2 * Detects: form submission. Pushes dataLayer event: elementor_form_submitted
3 * From the conversion-tracking skill in Marketing Skills */
4(function () {
5 if (window.__ctDetectElementorForms) return;
6 window.__ctDetectElementorForms = true;
7 window.dataLayer = window.dataLayer || [];
8 var seenEvents = typeof WeakSet === 'function' ? new WeakSet() : null;
9 function formFrom(target) {
10 try {
11 if (!target || target === document || target === window) return null;
12 if (target.matches && target.matches('form.elementor-form')) return target;
13 return target.closest ? target.closest('form.elementor-form') : null;
14 } catch (e) { return null; }
15 }
16 function formId(form) {
17 if (!form) return '';
18 if (form.id) return form.id;
19 var name = form.getAttribute && form.getAttribute('name');
20 if (name && name !== 'New Form') return name;
21 var widget = form.closest && form.closest('[data-id]');
22 return widget && widget.getAttribute('data-id') || '';
23 }
24 function onSuccess(event) {
25 if (event && seenEvents) {
26 if (seenEvents.has(event)) return;
27 seenEvents.add(event);
28 }
29 var form = formFrom(event && event.target);
30 var id = formId(form);
31 if (!form || !id) return;
32 var adapter = window.__ctElementorMethod2Emit;
33 if (typeof adapter === 'function') {
34 try { if (adapter(form, id) === true) return; }
35 catch (e) { return; }
36 }
37 window.dataLayer.push({ event: 'elementor_form_submitted', form_id: String(id) });
38 }
39 var handlerBound = false;
40 function hook() {
41 if (handlerBound) return true;
42 var jq = typeof jQuery !== 'undefined' ? jQuery : (typeof $ !== 'undefined' ? $ : null);
43 if (!jq) return false;
44 jq(document).on('submit_success', onSuccess);
45 handlerBound = true;
46 return true;
47 }
48 if (!hook()) {
49 document.addEventListener('DOMContentLoaded', hook, { once: true });
50 window.addEventListener('load', hook, { once: true });
51 }
52})();