Hi,
späte Antwort, sorry - hatte einen herrlich IT-freien Urlaub…
Die einfachste Lösung wäre, den Auslöser des Problems - sprich: das Neuladen der Seite - zu eleminieren, d.h. alle Aktionen/Klicks mittels Ajax zu verarbeiten.
Dazu müsste aber die gesamte Verarbeitung umgebaut werden. Ich nehme an, das ist keine Option für dich, und du suchst nach einer Lösung, die du auf deine Architektur/Plattform „on top“ draufpappen kannst.
Im Prinzip
ganz einfach:
- Scroll-Zustand des Fensters bei Klick ermitteln
Das Stichwort hast du schon genannt: pageXOffset bzw. pageYOffset.
- Scroll-Zustand speichern
Hier war cookies das korrekte Stichwort.
- Scroll-Zustand bei Neuladen der Seite wiederherstellen
cookie-Werte mit javascript auslesen und mit der Funktion
window.scrollTo(x, y)
wiederherstellen.
Voraussetzungen u. Einschränkungen:
* User muss cookies und javascript aktiviert haben
* Die Seite muss nach der Ausführung des Links exakt dieselbe Darstellung haben wie vorher - sonst stimmen die Scrollwerte nicht überein. Wenn also der User ohne Neuladen einzelne Bereiche auf- und zuklappen kann, oder wenn nach der Ausführung des Links bestimmte Seitenteile wegfallen/hinzukommen/geändert sind, taugt diese Lösung nicht. In dem Fall müssten clientseitige Zustandsänderungen ebenfalls erfasst und gespeichert werden, und in Schritt 3 wieder ausgelöst werden, bevor das Scrolling wiederhergestellt wird. Wenn auch noch serverseitig verursachte Zustandsänderungen hinzukommen, geht’s mit dieser Architektur gar nicht mehr bzw. wird so kompliziert, dass doch der Umstieg auf ajax angezeigt wäre.
Die folgende Datei kannst du als test.html auf einen Webserver spielen und per http:// testen.
Sie funktioniert NICHT per Direktaufruf im lokalen Dateisystem, weil die meisten Browser bei Verwendung des file:// Protokolls Cookies ignorieren.
Wenn du die Zeile
var activateOffsetHandling = true;
auf false änderst, kannst du testen, wie die Seite ohne Lösung funktioniert. Jeder der Links besitzt andere Parameter und springt zu einem anderen Anchor.
In der jetzigen Form hat das Bsp. einen Schönheitsfehler: wenn du 2x hintereinander denselben Link klickst, greift die Scroll-Korrektur nicht. Das ist aber nur ein Artefakt, weil ich die Links zu Demozwecken mit #xyz-Sprungzielen versehen habe. Beim 2. Klick ist das für den Browser dieselbe URL, so dass kein Neuladen stattfindet, aber das Sprungziel wird trotzdem ausgeführt. Die Scroll-Korrektur ist aber an das onload Event gekoppelt.
Wenn das stört, schmeiß einfach die #xyz-Sprungmarken (im href der Links) raus.
Das gilt natürlich auch für die javascript Meldungen mit alert().
Schöne Grüße
Thomas
########################################
TEST Viewport Wiederherstellung
var activateOffsetHandling = true;
var offsetHandlingCookieParam = ‚pageOffsetParamsXY‘;
var offsetHandlingCookieTimeout = 9999; // millisecs!
function savePageOffset() {
if (! activateOffsetHandling) return;
var poX = window.pageXOffset;
var poY = window.pageYOffset;
var nowDate = new Date();
var endDate = new Date(nowDate.getTime() + offsetHandlingCookieTimeout);
document.cookie = offsetHandlingCookieParam+’=’+poX+’:’+poY + ‚; expires=‘+endDate.toGMTString();
alert(‚saved pageOffset ‚+poX+‘:‘+poY);
}
function restorePageOffset() {
if (! activateOffsetHandling || ! document.cookie) return;
// alert(„cookie:\n“+ document.cookie);
var cookieParams = document.cookie.split(’; ‚);
for (var i=0; i<cookieParams.length-1; i++) {
var param = cookieParams[i].split(‘=’);
if (param[0] == offsetHandlingCookieParam) {
var xy_params = param[1].split(’:’);
window.scrollTo(xy_params[0], xy_params[1]);
alert(‚restored pageOffset ‚+xy_params[0]+‘:‘+xy_params[1]);
break;
}
}
}
TEST Viewport Wiederherstellung
Link 1: Springt zum Seitenende
Link 2: Springt zu Link 1
Link 3: Springt zu Link 3
Link 4: Springt zu Link 5
Link 5: Springt zum Seitenanfang
########################################