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