1/* 2 MM Antispam 3 (C) Minkenberg GmbH, Christoph Peters 4 https://www.minkenberg.de 5 Version: 1.31 6*/ 7 8let mmAntispamUserActive = false; 9function mmAntispamMarkActive() { 10 if (mmAntispamUserActive) return; 11 mmAntispamUserActive = true; 12 document.querySelectorAll('input[name=mm_asp_act]').forEach(function (input) { 13 input.value = '1'; 14 }); 15} 16function mmAntispamWatchActivity() { 17 const events = ['mousemove', 'keydown', 'touchstart', 'scroll', 'pointerdown']; 18 events.forEach(function (ev) { 19 window.addEventListener(ev, mmAntispamMarkActive, { passive: true, capture: true }); 20 }); 21 // Sicherheitsnetz fuer AJAX-/Popup-geladene Forms: 22 // Beim Submit das Aktivitaetsfeld im submittenden Form nachfuehren, falls auf der Seite bereits Aktivitaet stattfand 23 document.addEventListener('submit', function (e) { 24 if (!mmAntispamUserActive) return; 25 if (!e.target || typeof e.target.querySelectorAll !== 'function') return; 26 e.target.querySelectorAll('input[name=mm_asp_act]').forEach(function (input) { 27 input.value = '1'; 28 }); 29 }, true); 30} 31 32function mmAntispamhandleForms(selector) { 33 const forms = document.querySelectorAll(selector); 34 if (forms.length === 0) return; 35 const fieldValue = btoa(location.host); 36 forms.forEach(form => { 37 if (!form.querySelector('input[name=mm_asp_jsdyn]')) { 38 const input = document.createElement('input'); 39 input.type = 'hidden'; 40 input.name = 'mm_asp_jsdyn'; 41 input.value = fieldValue; 42 form.appendChild(input); 43 } 44 form.setAttribute('autocomplete', 'mm_asp_lastname'); 45 const crtsInput = form.querySelector('input[name=mm_asp_crts]'); 46 if (crtsInput && !crtsInput.dataset.mmAspFetched) { 47 crtsInput.dataset.mmAspFetched = '1'; 48 fetch(ajax_postajax.ajaxurl + '?action=mm_antispam_getcrts') 49 .then(response => response.text()) 50 .then(data => { 51 crtsInput.value = data; 52 }) 53 .catch(error => console.error('Error fetching crts:', error)); 54 } 55 // Falls (z.B. fuer Bricks/Divi) das Aktivitaetsfeld noch nicht im Form ist, einfuegen 56 if (!form.querySelector('input[name=mm_asp_act]')) { 57 const actInput = document.createElement('input'); 58 actInput.type = 'hidden'; 59 actInput.name = 'mm_asp_act'; 60 actInput.value = mmAntispamUserActive ? '1' : '0'; 61 form.appendChild(actInput); 62 } 63 }); 64} 65 66function mmAntispamInjectFormFields(selector) { 67 const forms = document.querySelectorAll(selector); 68 if (forms.length === 0) return; 69 if (ajax_fields && ajax_fields.fields) { 70 const fieldsHtml = atob(ajax_fields.fields); 71 forms.forEach(form => { 72 if (form.dataset.mmAspInjected) return; 73 form.dataset.mmAspInjected = '1'; 74 form.insertAdjacentHTML("beforeend", fieldsHtml); 75 }); 76 } 77} 78 79// Backwards-Compat: alter Funktionsname wird intern weiterverwendet 80function mmAntispamInjectBrixForm(selector) { 81 mmAntispamInjectFormFields(selector); 82} 83 84function mmAntispamProcessAll() { 85 mmAntispamhandleForms('form.wpcf7-form'); 86 mmAntispamhandleForms('form.elementor-form'); 87 mmAntispamhandleForms('form.avia_ajax_form'); 88 mmAntispamhandleForms('form.frm-fluent-form'); 89 90 // Bricks: Antispam-Felder per JS einfuegen, dann handlen 91 mmAntispamInjectFormFields('form.brxe-form'); 92 mmAntispamhandleForms('form.brxe-form'); 93 94 // Divi (Divi 4 klassisch + Divi 5 React): Antispam-Felder per JS einfuegen, dann handlen 95 mmAntispamInjectFormFields('form.et_pb_contact_form'); 96 mmAntispamhandleForms('form.et_pb_contact_form'); 97} 98 99function mmAntispamObserveDOM() { 100 if (typeof MutationObserver !== 'function') return; 101 let scheduled = false; 102 const observer = new MutationObserver(function () { 103 if (scheduled) return; 104 scheduled = true; 105 // Per Microtask-Wartezeit Mehrfach-Auslösungen während eines Renders bündeln 106 setTimeout(function () { 107 scheduled = false;
108 mmAntispamProcessAll(); 109 }, 100); 110 }); 111 observer.observe(document.body, { childList: true, subtree: true }); 112} 113 114document.addEventListener("DOMContentLoaded", function () { 115 mmAntispamWatchActivity(); 116 mmAntispamProcessAll(); 117 mmAntispamObserveDOM(); 118});
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.