Buchansicht: Sprung beim Laden überschreibt die Lesemodus-Position nicht mehr

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
team3
2026-10-08 17:04:01 +02:00
parent 20f33c07bb
commit 7b60b20856

View File

@@ -68,7 +68,8 @@ const aktiv = ref('')
const lese = ref(null) const lese = ref(null)
let beobachter = null let beobachter = null
let ladeSeq = 0 let ladeSeq = 0
// Leseposition auf dem Server merken (geräteübergreifend), gebündelt alle 1,5 s // Leseposition auf dem Server merken (geräteübergreifend), gebündelt alle 1,5 s; nicht während des Sprungs beim Laden
let ruhe = false, ruheTimer = null
let merkTimer = null let merkTimer = null
function merken(id) { function merken(id) {
clearTimeout(merkTimer) clearTimeout(merkTimer)
@@ -88,6 +89,10 @@ async function laden() {
spy() spy()
// Gemerkte Position hat Vorrang (die Adresse spiegelt nur den letzten Scrollstand); zuletzt im Lesemodus gelesen → dessen Stelle // Gemerkte Position hat Vorrang (die Adresse spiegelt nur den letzten Scrollstand); zuletzt im Lesemodus gelesen → dessen Stelle
const ziel = idVonLesemodus(pos) || pos.abschnitt || idVonNr(props.nr) const ziel = idVonLesemodus(pos) || pos.abschnitt || idVonNr(props.nr)
// Der Sprung beim Laden darf die gemerkte Position nicht überschreiben; erst eigenes Scrollen zählt wieder
ruhe = true
clearTimeout(ruheTimer)
ruheTimer = setTimeout(() => { ruhe = false }, 2500)
// Am Buchanfang (Vorwort) nicht scrollen, damit Titel und Knopfleiste sichtbar bleiben // Am Buchanfang (Vorwort) nicht scrollen, damit Titel und Knopfleiste sichtbar bleiben
if (ziel && ziel !== 'vorwort' && !aktiv.value) scrollZu(ziel) if (ziel && ziel !== 'vorwort' && !aktiv.value) scrollZu(ziel)
} }
@@ -131,7 +136,7 @@ function spy() {
beobachter?.disconnect() beobachter?.disconnect()
beobachter = new IntersectionObserver((es) => { beobachter = new IntersectionObserver((es) => {
if (lesemodus.value) return if (lesemodus.value) return
for (const e of es) if (e.isIntersecting) { aktiv.value = e.target.id; merken(e.target.id); emit('nr', { nr: nrVonId(e.target.id), push: false }) } for (const e of es) if (e.isIntersecting) { aktiv.value = e.target.id; if (!ruhe) merken(e.target.id); emit('nr', { nr: nrVonId(e.target.id), push: false }) }
}, { root: lese.value, rootMargin: '0px 0px -75% 0px' }) }, { root: lese.value, rootMargin: '0px 0px -75% 0px' })
document.querySelectorAll('.buch [data-spy]').forEach((el) => beobachter.observe(el)) document.querySelectorAll('.buch [data-spy]').forEach((el) => beobachter.observe(el))
} }