From 87725ee3d954feb16c57eb2cceb66d4d87e4934e Mon Sep 17 00:00:00 2001 From: Dotty Dotter Date: Sat, 9 May 2026 01:02:43 +0200 Subject: [PATCH] fix(quellen): Submit-Listener direkt binden, nicht via DOMContentLoaded MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- app/templates/v2/screens/quellen.html | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) 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 %}