fix(quellen): Submit-Listener direkt binden, nicht via DOMContentLoaded

Folge-Fix zu 501f32b: das body_scripts-Skript läuft am Ende des Body,
da ist DOMContentLoaded oft schon vorbei. Der bisherige Wrapper
``document.addEventListener('DOMContentLoaded', ...)`` wurde dann nie
gefeuert, der Submit-Listener nie gebunden — Suchknopf weiter still.

Lösung: IIFE direkt aufrufen + Idempotenz-Marker (``_quellenBound``)
gegen Doppelbindung.
This commit is contained in:
Dotty Dotter 2026-05-09 01:02:43 +02:00
parent 501f32b9ae
commit 87725ee3d9

View File

@ -380,27 +380,33 @@ async function runSearch(ev) {
return false; return false;
} }
// Form-Submit + Filter-Wechsel binden // Form-Submit + Filter-Wechsel binden.
document.addEventListener('DOMContentLoaded', () => { // Direkt im body_scripts-Block — wenn das Script läuft, ist DOMContentLoaded
// Wichtig: `runSearch` ist async, returnt Promise<false>. Das ist truthy, // häufig schon vorbei (Script kommt am Ende des Body). Daher kein
// also würde `onsubmit="return runSearch(event)"` das Default-Submit // addEventListener('DOMContentLoaded', …) als Wrapper.
// NICHT verhindern und der fetch würde mit "Failed to fetch" abbrechen, //
// weil die Page navigiert. Stattdessen via addEventListener binden — da // Wichtig: `runSearch` ist async und returnt Promise<false>. Das ist truthy,
// ist `event.preventDefault()` synchron geblieben, bevor der Promise // also würde `onsubmit="return runSearch(event)"` das Default-Submit NICHT
// resolvt. // verhindern, der fetch würde mit "Failed to fetch" abbrechen, weil die Page
// navigiert. Stattdessen über addEventListener binden — da bleibt
// `event.preventDefault()` synchron, bevor der Promise resolvt.
(function bindQuellenSearch() {
const form = document.getElementById('quellen-search-form'); const form = document.getElementById('quellen-search-form');
if (form) { if (form && !form._quellenBound) {
form._quellenBound = true;
form.addEventListener('submit', (ev) => { form.addEventListener('submit', (ev) => {
ev.preventDefault(); ev.preventDefault();
runSearch(); runSearch();
}); });
} }
document.querySelectorAll('input[name="qfilter"]').forEach(r => { document.querySelectorAll('input[name="qfilter"]').forEach(r => {
if (r._quellenBound) return;
r._quellenBound = true;
r.addEventListener('change', () => { r.addEventListener('change', () => {
const q = (document.getElementById('quellen-q') || {}).value || ''; const q = (document.getElementById('quellen-q') || {}).value || '';
if (q.trim().length >= 2) runSearch(); if (q.trim().length >= 2) runSearch();
}); });
}); });
}); })();
</script> </script>
{% endblock %} {% endblock %}