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:
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user