1/* 2 MM Antispam 3 (C) Minkenberg GmbH, Christoph Peters 4 https://www.minkenberg.de 5 Version: 1.35 6*/ 7 8let mmAntispamUserActive = false; 9 10// Setzt in allen (oder einem gegebenen) Formularen das Aktivitaetsfeld auf "1". 11function mmAntispamSetActive(root) { 12 const scope = (root && typeof root.querySelectorAll === 'function') ? root : document; 13 scope.querySelectorAll('input[name=mm_asp_act]').forEach(function (input) { 14 if (input.value !== '1') input.value = '1'; 15 }); 16} 17 18// Globaler Aktivitaets-Handler (Window-Listener). Schneller Pfad ueber Merker, 19// setzt beim ersten echten Event alle vorhandenen Felder auf "1". 20function mmAntispamMarkActive() { 21 if (mmAntispamUserActive) return; 22 mmAntispamUserActive = true; 23 mmAntispamSetActive(); 24} 25 26function mmAntispamWatchActivity() { 27 const events = ['mousemove', 'keydown', 'touchstart', 'scroll', 'pointerdown']; 28 events.forEach(function (ev) { 29 window.addEventListener(ev, mmAntispamMarkActive, { passive: true, capture: true }); 30 }); 31 // Commit-Momente (Capture-Phase => laeuft VOR dem Submit-Handler des Form-Builders): 32 // pointerdown feuert vor click/submit, submit als zweite Garantie. Beide setzen das 33 // Aktivitaetsfeld UNBEDINGT (ohne One-Shot-Gate). So ist ein vom Form-Builder frisch 34 // gerendertes/zurueckgesetztes Feld garantiert "1", wenn (z.B. Elementor per AJAX) 35 // serialisiert wird. Direkt-POST-Bots loesen diese Events in unserem JS nie aus. 36 document.addEventListener('pointerdown', function (e) { 37 mmAntispamUserActive = true; 38 const form = e.target && e.target.closest ? e.target.closest('form') : null; 39 if (form) mmAntispamSetActive(form); else mmAntispamSetActive(); 40 }, { passive: true, capture: true }); 41 document.addEventListener('submit', function (e) { 42 mmAntispamUserActive = true; 43 mmAntispamSetActive(e.target); 44 }, true); 45} 46 47// Bindet form-eigene Aktivitaets-Listener. Robust gegen Re-Render/Reset des 48// Aktivitaetsfeldes durch den Form-Builder: die Interaktion mit GENAU diesem Form setzt 49// sein Feld direkt - unabhaengig vom globalen Merker und davon, ob Window-Events durchkommen. 50function mmAntispamBindFormActivity(form) { 51 if (!form.dataset.mmAspActBound) { 52 form.dataset.mmAspActBound = '1'; 53 const formEvents = ['pointerdown', 'keydown', 'input', 'focusin']; 54 formEvents.forEach(function (ev) { 55 form.addEventListener(ev, function () { 56 mmAntispamUserActive = true; 57 mmAntispamSetActive(form); 58 }, { passive: true }); 59 }); 60 } 61 // Falls global bereits Aktivitaet stattfand, ein evtl. frisch gerendertes/ 62 // zurueckgesetztes Feld dieses Forms sofort nachziehen. 63 if (mmAntispamUserActive) mmAntispamSetActive(form); 64} 65 66function mmAntispamhandleForms(selector) { 67 const forms = document.querySelectorAll(selector); 68 if (forms.length === 0) return; 69 const fieldValue = btoa(location.host); 70 forms.forEach(form => { 71 if (!form.querySelector('input[name=mm_asp_jsdyn]')) { 72 const input = document.createElement('input'); 73 input.type = 'hidden'; 74 input.name = 'mm_asp_jsdyn'; 75 input.value = fieldValue; 76 form.appendChild(input); 77 } 78 form.setAttribute('autocomplete', 'mm_asp_lastname'); 79 const crtsInput = form.querySelector('input[name=mm_asp_crts]'); 80 if (crtsInput && !crtsInput.dataset.mmAspFetched) { 81 crtsInput.dataset.mmAspFetched = '1'; 82 fetch(ajax_postajax.ajaxurl + '?action=mm_antispam_getcrts') 83 .then(response => response.text()) 84 .then(data => { 85 crtsInput.value = data; 86 }) 87 .catch(error => console.error('Error fetching crts:', error)); 88 } 89 // Falls (z.B. fuer Bricks/Divi) das Aktivitaetsfeld noch nicht im Form ist, einfuegen 90 if (!form.querySelector('input[name=mm_asp_act]')) { 91 const actInput = document.createElement('input'); 92 actInput.type = 'hidden'; 93 actInput.name = 'mm_asp_act'; 94 actInput.value = mmAntispamUserActive ? '1' : '0'; 95 form.appendChild(actInput); 96 } 97 // Aktivitaets-Tracking fuer dieses Form scharf schalten (bzw. Feld nachziehen) 98 mmAntispamBindFormActivity(form); 99 }); 100} 101 102function mmAntispamInjectFormFields(selector) { 103 const forms = document.querySelectorAll(selector); 104 if (forms.length === 0) return; 105 if (ajax_fields && ajax_fields.fields) { 106 const fieldsHtml = atob(ajax_fields.fields);
107 forms.forEach(form => { 108 if (form.dataset.mmAspInjected) return; 109 form.dataset.mmAspInjected = '1'; 110 form.insertAdjacentHTML("beforeend", fieldsHtml); 111 }); 112 } 113} 114 115// Backwards-Compat: alter Funktionsname wird intern weiterverwendet 116function mmAntispamInjectBrixForm(selector) { 117 mmAntispamInjectFormFields(selector); 118} 119 120function mmAntispamProcessAll() { 121 mmAntispamhandleForms('form.wpcf7-form'); 122 mmAntispamhandleForms('form.elementor-form'); 123 mmAntispamhandleForms('form.avia_ajax_form'); 124 mmAntispamhandleForms('form.frm-fluent-form'); 125 126 // Bricks: Antispam-Felder per JS einfuegen, dann handlen 127 mmAntispamInjectFormFields('form.brxe-form'); 128 mmAntispamhandleForms('form.brxe-form'); 129 130 // Divi (Divi 4 klassisch + Divi 5 React): Antispam-Felder per JS einfuegen, dann handlen 131 mmAntispamInjectFormFields('form.et_pb_contact_form'); 132 mmAntispamhandleForms('form.et_pb_contact_form'); 133} 134 135function mmAntispamObserveDOM() { 136 if (typeof MutationObserver !== 'function') return; 137 let scheduled = false; 138 const observer = new MutationObserver(function () { 139 if (scheduled) return; 140 scheduled = true; 141 // Per Microtask-Wartezeit Mehrfach-Auslösungen während eines Renders bündeln 142 setTimeout(function () { 143 scheduled = false; 144 mmAntispamProcessAll(); 145 }, 100); 146 }); 147 observer.observe(document.body, { childList: true, subtree: true }); 148} 149 150document.addEventListener("DOMContentLoaded", function () { 151 mmAntispamWatchActivity(); 152 mmAntispamProcessAll(); 153 mmAntispamObserveDOM(); 154});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.