ckruse / cforum

https://github.com/ckruse/cforum_ex/
GNU Affero General Public License v3.0
22 stars 5 forks source link

„Springen“ beim Laden der Seite #692

Closed JuliusPC closed 7 years ago

JuliusPC commented 7 years ago

Wenn man eine Seite im Forum lädt beispielsweise diese hier und dann – während sie zwar schon dargestellt wird und der Browser den Anker schon angesprungen hat, aber noch irgendetwas (MathJax?) geladen wird – schon beginnt weiterzuscrollen, wird man bei Beenden des Ladens an die Position des Ankers zurückgeworfen. Dies ist auch der Fall, wenn man auf einen Link klickt und dann später im Browser zurück geht oder die Seite neu lädt, man landet nicht an der Position, an der man zuletzt war, sondern dort, wo der Anker ist...
Ein weiterer Fall ist der, dass Mobil-Browser Seiten bei Arbeitsspeichermangel gerne mal neu rendern und dann auch die letzte Position verloren geht.

Gibt es ein Mittelchen dagegen? JavaScript abschalten oder Nutzen der Thread-Ansicht würden zwar das Problem beseitigen bzw. lindern (weniger Inhalt), aber wirklich komfortabel ist das nicht.

ckruse commented 7 years ago

Das ist erwünschtes Verhalten gewesen. Ich habe das hinspringen zum Anker extra einbauen sollen:

    if($("body").hasClass("nested-view") && window.scrollTo) {
      var anchor = document.location.hash;
      if(anchor) {
        var offset = $(anchor).offset();
        window.scrollTo(offset.left, offset.top);
      }
    }

Ich könnte höchstens den Zeitpunkt nach vorne verschieben, wann gesprungen wird, indem ich das JS aus dem DOMContentLoaded rausnehme.

JuliusPC commented 7 years ago

Das ist erwünschtes Verhalten gewesen.

Was ist der Nutzen – der Browser springt den Anker ja sowieso an? Den habe ich bisher nicht entdeckt – was natürlich nicht heißen muss, dass er nicht existiert...

Ich könnte höchstens den Zeitpunkt nach vorne verschieben, wann gesprungen wird, indem ich das JS aus dem DOMContentLoaded rausnehme.

Selbst dann bleibt aber das Problem beim Zurückgehen in der Browserhistorie und beim Neurendern auf mobilen Geräten. Kann ich das im User-JS zumindest für mich irgendwie unterbinden?

ckruse commented 7 years ago

Was ist der Nutzen – der Browser springt den Anker ja sowieso an? Den habe ich bisher nicht entdeckt – was natürlich nicht heißen muss, dass er nicht exisitert.

ich kann mich gerade nicht mehr erinnern, warum das gewünscht war, ich weiss nur, dass ich es auf expliziten Wunsch eingebaut habe. Ich schaue mir das nachher nochmal an, vielleicht finde ich ja die Diskussion im Forum wieder.

Kann ich das im User-JS zumindest für mich irgendwie unterbinden?

Du kannst window.scrollTo mit function() {} überschreiben.

LG, CK

-- https://wwwtech.de/

JuliusPC commented 7 years ago

Kann ich das im User-JS zumindest für mich irgendwie unterbinden? Du kannst window.scrollTo mit function() {} überschreiben.

Meinst du das so? Funktioniert nicht, das Springen bleibt.

window.scrollTo = function() {}

Ich bin nicht so der JS-Profi...

ckruse commented 7 years ago

Kann ich das im User-JS zumindest für mich irgendwie unterbinden? Du kannst window.scrollTo mit function() {} überschreiben.

Meinst du das so? Funktioniert nicht.

window.scrollTo = function() {}

Ja, das meinte ich. Naja, das verhindert zumindest das scrollen durch JS. Alles andere macht dann der Browser, und da hab ich wenig Einfluss drauf.

MatthiasApsel commented 7 years ago

Es war (mein) Wunsch, dass immer zum obersten ungelesenen Beitrag gescrollt wird.

JuliusPC commented 7 years ago

@ckruse

window.scrollTo = function() {}

Ja, das meinte ich. Naja, das verhindert zumindest das scrollen durch JS.

Nö, der scrollt dennoch. Kann es sein, dass ich die Funktion – laienhaft ausgedrückt – nicht rechtzeitig überschreibe?

Alles andere macht dann der Browser, und da hab ich wenig Einfluss drauf.

Das ist klar, aber der Browser scrollt schon an die richtige Stelle, nur dann funkt halt das JS dazwischen.

@MatthiasApsel

Es war (mein) Wunsch, dass immer zum obersten ungelesenen Beitrag gescrollt wird.

... aber es wird doch zu dem gescrollt, der im Fragment-Identifier genannt wurde und den man explizit aufgerufen hat – was der Browser ohne JS auch zufriedenstellend macht (durch temporäres Deaktivieren von JS getestet). Nur macht das JS halt das Speichern und Wiederherstellen der Position durch den Browser nach dem Neuladen der Seite kaputt.

MatthiasApsel commented 7 years ago

Man muss da zwei Seiten unterscheiden, einmal die Übersichtsseite und zum anderen die Threadseiten, also etwa https://forum.selfhtml.org/all bzw. https://forum.selfhtml.org/meta/2017/feb/28/weiterleitungen-im-wiki/1688372#m1688372

Wenn ich https://forum.selfhtml.org/all aufrufe, wird zum obersten ungelesenen Beitrag gescrollt.

Auf den Threadseiten gibt es natürlich das Fragment, zu dem gescrollt wird. Dort kommt das Springen vielleicht durch das Zusammenklappen der gelesenen Beiträge zu stande.

JuliusPC commented 7 years ago

Man muss da zwei Seiten unterscheiden, einmal die Übersichtsseite und zum anderen die Threadseiten, also etwa https://forum.selfhtml.org/all bzw. https://forum.selfhtml.org/meta/2017/feb/28/weiterleitungen-im-wiki/1688372#m1688372

Ich bezog mich auf letzteres.

Wenn ich https://forum.selfhtml.org/all aufrufe, wird zum obersten ungelesenen Beitrag gescrollt.

Bei mir momentan nicht. Das betroffene User-JS ist raus, JS im Browser aktiviert, momentan keine ungelesenen Beiträge auf der Startseite. Ich werde das mal beobachten.

Auf den Threadseiten gibt es natürlich das Fragment, zu dem gescrollt wird. Dort kommt das Springen vielleicht durch das Zusammenklappen der gelesenen Beiträge zu stande.

Da wird nichts zusammengeklappt. Ich habe mal ein Video aufgenommen, dass das ganze veranschaulicht:
https://julius-cordes.de/uploads/self-spruenge.mp4

Ich habe einen Thread in der nested-Ansicht geladen, scrolle etwas nach oben (das ausgewählte Fragment ist gerade so noch im Bild zu sehen und drücke dann den neu-laden-Button. Nachdem MathJax durchgelaufen ist, springt der Browser. Mit deaktiviertem JS passiert das nicht.

JuliusPC commented 7 years ago

@ckruse

ich kann mich gerade nicht mehr erinnern, warum das gewünscht war, ich weiss nur, dass ich es auf expliziten Wunsch eingebaut habe.

Ich glaube, jetzt den Sinn dieser Funktionalität herausgefunden zu haben:
Wenn die Option „Gelesene Nachrichten im Nested-Modus zusammenfalten“ aktiviert ist, ist das Springen zum gewünschten Beitrag nötig, um nicht irgendwo zu landen, weil scheinbar der Browser erst den Anker anspringt und dann erst die gelesenen Beiträge eingeklappt werden, sodass man sich nicht mehr an der Position des gewünschten Beitrags befindet. Da hilft das Springen.

Wäre es möglich, das Springen zu deaktiveren, wenn die genannte Option aktiviert ist?

ckruse commented 7 years ago

Hey,

sorry für die Verzögerung, ich schaue heute Abend mal genauer. Ich bin am Sonntag aus dem Urlaub zurück gekommen, Montag war Familien-Gedöns wegen Ostern und Dienstag war voll mit Post-Urlaub-Arbeit…

LG,

MatthiasApsel commented 7 years ago

Die muss noch mal aufgemacht werden, jetzt werden auch die ungelesenen Beiträge nicht mehr ausgeklappt, nur noch der, den man gerade angeklickt hat. Damit ist die Grundfunktionalität nicht mehr gegeben.

ckruse commented 7 years ago

genau genommen ist das ein neuer Bug ;) Aber ja, hab ich auch gerade bemerkt.

ckruse commented 7 years ago

Das Problem war, dass is_read immer wahr ist, weil in der Nested-Ansicht zu dem Zeitpunkt die Nachricht schon gelesen ist… ich musste die Prüfung umschreiben.