) | Bedingung: Gesamte Website * * Erwartete Struktur: * Button-Widget -> Erweitert > CSS-Klassen: bewerbungsformular * -> Erweitert > Attribute: data-stelle|Schlepperfahrer / Maschinist * Formular -> Hidden Field mit ID: stelle (=> input#form-field-stelle) */ (function () { 'use strict'; var TRIGGER_SELECTOR = '.bewerbungsformular'; var DATA_ATTRIBUTE = 'data-stelle'; var FIELD_ID = 'form-field-stelle'; var FIELD_NAME = 'form_fields[stelle]'; var DEBUG = false; // auf true setzen zum Testen (Konsole) var currentStelle = ''; var retryTimer = null; function log() { if (DEBUG && window.console) { console.log.apply(console, ['[Bewerbung]'].concat([].slice.call(arguments))); } } /** Alle Instanzen des Hidden Fields einsammeln (Popup kann mehrfach im DOM liegen). */ function getFields() { var list = []; var byName = document.querySelectorAll('input[name="' + FIELD_NAME + '"]'); var byId = document.querySelectorAll('#' + FIELD_ID + ', [id^="' + FIELD_ID + '"]'); [].forEach.call(byName, function (el) { if (list.indexOf(el) === -1) { list.push(el); } }); [].forEach.call(byId, function (el) { if (el.tagName === 'INPUT' && list.indexOf(el) === -1) { list.push(el); } }); return list; } /** Wert in alle gefundenen Felder schreiben. Gibt true zurück, wenn mindestens eins befüllt wurde. */ function fillFields(value) { if (!value) { return false; } var fields = getFields(); if (!fields.length) { return false; } fields.forEach(function (field) { if (field.value !== value) { field.value = value; field.dispatchEvent(new Event('input', { bubbles: true })); field.dispatchEvent(new Event('change', { bubbles: true })); } }); log('Feld befüllt:', value, '(' + fields.length + 'x)'); return true; } /** * Elementor rendert das Popup erst beim Öffnen bzw. per AJAX. * Deshalb wird nach dem Klick bis zu 6 Sekunden lang wiederholt versucht zu befüllen. */ function fillWithRetry(value) { if (retryTimer) { clearInterval(retryTimer); retryTimer = null; } if (!value) { return; } if (fillFields(value)) { return; } var attempts = 0; retryTimer = setInterval(function () { attempts++; if (fillFields(value) || attempts > 60) { // 60 x 100ms = 6s clearInterval(retryTimer); retryTimer = null; } }, 100); } /** Wert des geklickten Buttons ermitteln – Attribut kann am Wrapper oder am inneren Element sitzen. */ function resolveStelle(target) { if (!target || !target.closest) { return ''; } var holder = target.closest('[' + DATA_ATTRIBUTE + ']'); if (holder) { return holder.getAttribute(DATA_ATTRIBUTE) || ''; } var trigger = target.closest(TRIGGER_SELECTOR); if (trigger) { var inner = trigger.querySelector('[' + DATA_ATTRIBUTE + ']'); if (inner) { return inner.getAttribute(DATA_ATTRIBUTE) || ''; } } return ''; } /* 1. Klick auf den Bewerbungs-Button (Capture-Phase) */ document.addEventListener('click', function (e) { var target = e.target; if (!target || !target.closest) { return; } if (!target.closest(TRIGGER_SELECTOR)) { return; } var value = resolveStelle(target); if (!value) { log('Kein ' + DATA_ATTRIBUTE + '-Wert am geklickten Button gefunden.'); return; } currentStelle = value; log('Klick erkannt, Stelle =', currentStelle); fillWithRetry(currentStelle); }, true); /* 2. Offizielles Elementor-Pro-Popup-Event (seit Pro 2.7) */ function bindPopupEvents($) { $(document).on('elementor/popup/show', function () { log('elementor/popup/show'); fillFields(currentStelle); setTimeout(function () { fillFields(currentStelle); }, 150); setTimeout(function () { fillFields(currentStelle); }, 600); }); // Nach erfolgreichem Absenden setzt Elementor das Formular zurück -> Wert neu setzen $(document).on('submit_success', function () { setTimeout(function () { fillFields(currentStelle); }, 300); }); } if (window.jQuery) { bindPopupEvents(window.jQuery); } else { document.addEventListener('DOMContentLoaded', function () { if (window.jQuery) { bindPopupEvents(window.jQuery); } }); } /* 3. Sicherheitsnetz: Popup-Markup wird nachträglich ins DOM geschoben. */ if (window.MutationObserver) { var observer = new MutationObserver(function (mutations) { if (!currentStelle) { return; } for (var i = 0; i < mutations.length; i++) { if (mutations[i].addedNodes && mutations[i].addedNodes.length) { fillFields(currentStelle); break; } } }); observer.observe(document.documentElement, { childList: true, subtree: true }); } })();