Prüfen ob Anzeigebereich nach unten gescrollt ist.
DaDyne
- javascript
Hallo,
ich habe ein Dokument in das nach und nach per Ajax Daten geladen werden und unten angefügt werden.
etwa so:
Zeile1
[... zeit-intervall ...]
Zeile2
[... zeit-intervall ...]
Zeile3
etc..
Nun soll folgendes geschehen: Wenn der Anzeigebereich nach ganz unten gescrollt ist, dann soll -sobald neue Daten geschrieben werden- per scrollTo(0, 9999); nach ganz unten gescrollt werden. Wenn aber jemand gerade einen Bereich liest der weiter oben steht, dann soll nicht automatisch gescrollt werden. Wie kann ich prüfen ob ganz nach unten gescrollt ist oder nicht?
MfG
DaDyne
n'abend,
Nun soll folgendes geschehen: Wenn der Anzeigebereich nach ganz unten gescrollt ist, dann soll -sobald neue Daten geschrieben werden- per scrollTo(0, 9999); nach ganz unten gescrollt werden. Wenn aber jemand gerade einen Bereich liest der weiter oben steht, dann soll nicht automatisch gescrollt werden. Wie kann ich prüfen ob ganz nach unten gescrollt ist oder nicht?
ich habe vor einiger Zeit etwas passendes auf quirksmode.org (welche übrigens ihre vHosts reparieren wollen) gelesen. Die Quintessenz daraus:
function distanceToBottom()
{
var scrollPosition;
var viewportHeight;
var documentHeight;
/*
* VERTICAL SCROLL POSITION
*/
if(window.pageYOffset)
scrollPosition = window.pageYOffset;
// Explorer 6 Strict
else if(document.documentElement && document.documentElement.scrollTop)
scrollPosition = document.documentElement.scrollTop;
// all other Explorers
else if(document.body)
scrollPosition = document.body.scrollTop;
/*
* DOCUMENT HEIGHT
*/
if (window.innerHeight && window.scrollMaxY)
documentHeight = window.innerHeight + window.scrollMaxY;
// all but Explorer Mac
else if(document.body.scrollHeight > document.body.offsetHeight)
documentHeight = document.body.scrollHeight;
// Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
else
documentHeight = document.body.offsetHeight;
/*
* VIEWPORT HEIGHT
*/
// all except Explorer
if(window.innerHeight)
viewportHeight = window.innerHeight;
// Explorer 6 Strict Mode
else if(document.documentElement && document.documentElement.clientHeight)
viewportHeight = document.documentElement.clientHeight;
// other Explorers
else if(document.body)
viewportHeight = document.body.clientHeight;
return documentHeight - viewportHeight - scrollPosition;
}
Wir ermitteln die Höhe des Dokuments (documentHeight), die Höhe des sichtbaren Bereichs (viewportHeight) und die aktuelle Position im Dokument (scrollPosition). Wir benötigen die Höhe des sichtbaren Bereichs, weil scrollPosition die obere Kante des viewports angibt.
Wenn du diese Funktion im Firefox / Safari ausführst, bekommst du in jedem Fall 0 zurückgeliefert, wenn du am Ende der Seite bist. Der Internet Explorer macht da wieder mal lustige Sachen. Der margin des body-Elements wird beim Ermitteln der documentHeight nicht berücksichtigt. Wenn <body> bspw. margin:10px hat, liefert die Funktion distanceToBottom() -20, weil marginTop und marginBottom nicht von documentHeight abgezogen wurden. wenn du einen negativen Margin auf <body> hast, ist der Rückgabewert der Margingröße entsprechend positiv. (Ich schätze aber einfach mal, dass negative Margins auf <body> eher die Seltenheit darstellen...)
Dein vorgehen ist also recht einfach:
var isAtBottom = ( distanceToBottom() <= 0 );
/* dein-Ajax-hinzufüge-kram */
if( isAtBottom )
window.scrollBy( 0, 123456789 );
wichtig ist zu sehen, dass VOR dem Hinzufügen neuer Inhalte geprüft werden muss, ob wir uns am Ende des Dokuments befinden...
weiterhin schönen abend...
Klingt super!
mal sehn ob ichs heute noch ausprobieren kann :)
weiterhin schönen abend...
gleichfalls!
läuft -wie zu erwarten- perfekt. Danke!