Wer im Chat hochscrollt, wird nicht mehr ans Ende gerissen

`pruef-chat-ausbau` stand seit dem 28.09. rot:

    FEHL die Stelle bleibt stehen (0 -> 3574)
    FEHL der Knopf sagt, wie viel wartet ("Zum neuesten")
    FEHL er zaehlt mit ("Zum neuesten")
    FEHL pruef-chat-ausbau: unbehandelter Fehler   (der Knopf blieb verborgen)

WAS WIRKLICH PASSIERTE: Man liest weiter oben im Verlauf, jemand
schreibt -- und man wird ans Ende gerissen. Der Zaehler „1 neue
Nachricht" wurde dabei zurueckgesetzt, der Knopf blieb verborgen.

DIE URSACHE STAND AN DER FALSCHEN STELLE. Die Zuhoerer, die „der
Mensch hat selbst gescrollt" feststellen (Rad, Finger, Taste,
Zeiger), hingen INNERHALB des Sprung-Blocks zur Neu-Linie -- wurden
also erst angehaengt, NACHDEM einmal gesprungen worden war.

In einem ruhigen Gespraech passiert das nie: Wer alles gelesen hat,
bekommt keine Neu-Linie, der Block laeuft nicht, die Zuhoerer gibt es
nicht. Scrollt er hoch und es kommt eine Nachricht, entsteht die
Linie ZUM ERSTEN MAL -- der Block laeuft, haengt die Zuhoerer an und
springt im selben Atemzug. Das Hochscrollen von vorhin hat nie jemand
bemerkt.

Das ist der haeufigste Fall ueberhaupt: ein stiller Chat, man liest
etwas weiter oben nach, jemand schreibt.

Die Wache steht jetzt beim Aufbau, bei den uebrigen Zuhoerern des
Verlaufs. Ausdruecklich NICHT am `scroll`-Ereignis: Der Sprung
scrollt selbst, und `scroll` unterscheidet nicht, wer gescrollt hat.
Rad, Finger, Taste und Zeiger tut nur ein Mensch.

UND DIE PRUEFUNG HAT SELBST GEMOGELT. Sie schrieb `e.scrollTop = 0`
-- das setzt die Bildlaufposition zu, ohne dass ein Rad gedreht
wurde. Damit haette sie den Fehler auch nach der Behebung noch
gemeldet. Sie dreht jetzt das Rad (`mouse.wheel`) und prueft, dass
sie oben angekommen ist. Dieselbe Lehre wie bei den Fingergeraeten:
`setViewportSize` macht aus einer Maus keinen Finger, und
`scrollTop = 0` macht aus einem Programm keinen Leser.

Nachher: 70 Pruefungen, 0 Fehler (vorher 24/4).
    die Stelle bleibt stehen (0 -> 0)
    der Knopf sagt, wie viel wartet ("1 neue Nachricht")
    er zaehlt mit ("2 neue Nachrichten")
    wer unten steht, wird weiterhin mitgenommen -- ohne Knopf

Alle sieben Chatpruefungen gruen: anhaenge 123/0, aufloesen 126/0,
ausbau 70/0, kanaele 81/0, neu-stelle 63/0, neu 36/0, optik 62/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-30 11:22:14 +02:00
co-authored by Claude Opus 5
parent 75ede0a8e9
commit 69517e090b
47 changed files with 734 additions and 679 deletions
+39 -7
View File
@@ -2567,13 +2567,20 @@
man gerade liest. Die Zuhoerer haengen am Verlauf und
werden nur einmal gesetzt (`einmalGebunden`), sonst kaemen
bei jedem Neuzeichnen neue dazu. */
const schluss = () => { nochNachziehen = false; zurNeuLinie = false; };
if (!ziel.dataset.neuWache) {
ziel.dataset.neuWache = 'ja';
for (const art of ['wheel', 'touchstart', 'keydown', 'pointerdown']) {
ziel.addEventListener(art, schluss, { passive: true });
}
}
/* DIE WACHE STEHT NICHT MEHR HIER (30.09.2026).
Sie hing bis dahin in diesem Block — also wurde sie erst
angehängt, wenn einmal zur Neu-Linie gesprungen wurde. In
einem ruhigen Gespräch passiert das nie: Wer alles gelesen
hat, bekommt keine Linie, der Block läuft nicht, die
Zuhörer gibt es nicht. Scrollt er dann hoch und es kommt
eine Nachricht, entsteht die Linie ZUM ERSTEN MAL — der
Block läuft, hängt die Zuhörer an und springt im selben
Atemzug. Sein Hochscrollen hat nie jemand bemerkt.
Gemessen: „die Stelle bleibt stehen (0 -> 3574)". Jetzt
steht die Wache beim Aufbau, bei den übrigen Zuhörern des
Verlaufs. */
/* Nach spaetestens zwei Sekunden wird nicht mehr NACHGEZOGEN
-- der Merker bleibt aber stehen. Nachziehen faengt das
Nachwachsen von Schriften und Bildern ab; das ist nach zwei
@@ -4283,6 +4290,31 @@
$('text').focus();
});
/* ---------- WER SELBST SCROLLT, HAT ENTSCHIEDEN -------------------------
Ab da wird nicht mehr zur Neu-Linie gesprungen und nicht mehr
nachgezogen — sonst risse es einen aus dem Text, den man gerade
liest.
EINMAL BEIM AUFBAU, nicht im Sprung-Block (30.09.2026). Dort
stand sie bis dahin und wurde deshalb erst scharf, NACHDEM
einmal gesprungen worden war. Im häufigsten Fall überhaupt — ein
stiller Chat, man liest etwas weiter oben nach, jemand schreibt
— gab es sie damit nie, und man wurde ans Ende gerissen.
RAD, FINGER, TASTE, ZEIGER — und ausdrücklich NICHT `scroll`.
Der Sprung scrollt selbst; ein `scroll`-Ereignis unterscheidet
nicht, wer gescrollt hat. Diese vier tut nur ein Mensch. */
{
const wache = () => { nochNachziehen = false; zurNeuLinie = false; };
const v = $('verlauf');
if (v) {
for (const art of ['wheel', 'touchstart', 'keydown', 'pointerdown']) {
v.addEventListener(art, wache, { passive: true });
}
}
}
/* ---------- Zum neuesten springen ---------------------------------------- */
$('verlauf')?.addEventListener('scroll', () => {
const v = $('verlauf');