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 %}