javascript - Uendelig rulling-feil i Svelte heksavisningskomponent
Jeg har jobbet med å lage en heksadesimalvisningskomponent som kan håndtere visningen av vilkårlig store matriser. Det forventes opptil titalls millioner verdier. Jeg har klart å få denne komponenten stort sett til å fungere, men det har vært en unnvikende feil som jeg har vært fast med i flere dager.
Ideen er å kun gjengi til DOM det som for øyeblikket er synlig på skjermen. Det finnes spacer-elementer over og under visningsområdet som etterligner forflytningen av cellene som ikke blir gjengitt.
Den relevante komponenten kan finnes her: https://github.com/DamenH/hex-viewer/blob/master/src/lib/SmartDataGrid.svelte
Denne funksjonen beregner start- og sluttindeksene til arrayet som for øyeblikket er synlige i viewporten, og endrer deretter visibleCells for å inneholde det området av verdier.
function updateVisibleCells() {
let visibleAreaStart = dataGrid.scrollTop;
let visibleAreaEnd = dataGrid.scrollTop + height;
let startIndex = Math.floor(visibleAreaStart / cellHeight) * columns;
let endIndex = Math.ceil(visibleAreaEnd / cellHeight) * columns;
endIndex = Math.min(items.length, endIndex);
[currentStartIndex, currentEndIndex] = [startIndex, endIndex];
visibleCells = items.slice(startIndex, endIndex);
}
Denne funksjonen beregner størrelsen på avstandsstykkene over og under de gjengitte cellene.
function updateSizes() {
topSpacerHeight = Math.floor(currentStartIndex / columns) * cellHeight;
bottomSpacerHeight =
Math.floor((items.length - currentEndIndex) / columns) * cellHeight;
}
Problemet.
Når man blar nedover, enten via rullehåndtaket, midt- eller rullehjulet på musen, eller ved å dra midt- eller museknappen, begynner rullingen å gå i loop automatisk uten å stoppe.
Jeg tror det som skjer er at det opprettes en loop der den øverste spacer beregnes feil, noe som utløser en scroll-hendelse, som fortsetter i det uendelige. Det som virkelig overrasker meg er at dette bare skjer når man skroller ned. Å skrolle opp er glatt, og som forventet. Forsøk på å endre den øverste spaceren for å motvirke dette resulterer i at oppførselen også skjer ved skrolling opp.
Her er en demo av komponenten.
https://damenh.github.io/hex-viewer/
Jeg vil virkelig sette pris på all hjelp med dette.
Oppdater
Etter noen flere tester har jeg oppdaget at dette ser ut til å bare skje i Chrome. Jeg har sendt inn en feilrapport til Chrome. Jeg vil prøve å gjenskape denne komponenten med Vue. Hvis problemet vedvarer, ville det være veldig interessant.