Jak uzyskać i ustawić bieżącą pozycję przewijania strony internetowej?


121

Jak mogę uzyskać i ustawić bieżącą pozycję przewijania strony internetowej?

Mam długi formularz, który wymaga odświeżenia na podstawie działań / danych wejściowych użytkownika. W takim przypadku strona resetuje się na samą górę, co jest denerwujące dla użytkowników, ponieważ muszą przewinąć z powrotem do miejsca, w którym się znajdowali.

Gdybym mógł uchwycić bieżącą pozycję przewijania (w ukrytych danych wejściowych) przed ponownym załadowaniem strony, mógłbym następnie ustawić ją z powrotem po ponownym załadowaniu.


Czy formularz oparty na AJAX nie jest lepszym sposobem zapobiegania tym efektom (i oczywiście zapewnia rezerwę na wypadek niedostępności XHR)? Po przeładowaniu strony strona przeskakuje na górę iz powrotem, co może być irytujące.
Marcel Korpel

Odpowiedzi:


118

Szukasz document.documentElement.scrollTopnieruchomości.


dzięki, znalazłem to: artykuły.sitepoint.com / article / javascript -from-scratch/6 i zmodyfikowałem, getScrollingPosition()aby przechowywać wartości w ukrytych zmiennych. Następnie w html odświeżonej strony <body onLoad="window.scrollTo(x,y), której używam , gdzie x i y to te z wartości ukrytych!
xyz

46
Odkryłem, że przynajmniej w Chrome na Ubuntu document.documentElement.scrollTopzawsze zwraca 0. document.body.scrollTopJednak wydaje się, że działa. Z drugiej strony jeden Firefox na Ubuntu jest odwrotny - dostajesz 0 bodyi prawidłową kwotę documentElement. Masz jakiś pomysł, co daje?
tobek

12
Ta odpowiedź nie jest dokładna, ponieważ scrollTopusługa nie działa we wszystkich przeglądarkach. Sprawdź window.pageXOffseti window.pageYOffsetdla lepszych wyników.
gyo

135

Aktualnie akceptowana odpowiedź jest nieprawidłowa - document.documentElement.scrollTopzawsze zwraca 0 w przeglądarce Chrome. Dzieje się tak, ponieważ WebKit używa bodydo śledzenia przewijania, podczas gdy Firefox i IE używają html.

Aby uzyskać aktualną pozycję, chcesz:

document.documentElement.scrollTop || document.body.scrollTop

Możesz ustawić bieżącą pozycję na 1000 pikseli w dół strony, w następujący sposób:

document.documentElement.scrollTop = document.body.scrollTop = 1000;

Lub za pomocą jQuery (animuj go, gdy jesteś na tym!):

$("html, body").animate({ scrollTop: "1000px" });

5
Odpowiedź gyo, sugerująca, że window.pageYOffsetjest czystsza, jeśli używasz metod window.scrollBy()lub window.scrollTo().
igorsantos 07

32

Istnieją pewne niespójności w sposobie, w jaki przeglądarki wyświetlają współrzędne przewijania bieżącego okna. Wygląda na to, że Google Chrome na Macu i iOS zawsze powraca 0podczas używania document.documentElement.scrollToplub jQuery $(window).scrollTop().

Jednak działa spójnie z:

// horizontal scrolling amount
window.pageXOffset

// vertical scrolling amount
window.pageYOffset

Też to zauważyłem, czy to błąd na Macu i iOS?
Alexander Kim

@AlexanderKim Myślę, że może to być związane ze sposobem interpretacji niektórych reguł CSS (takich jak przepełnienie) i zostało zgłoszone, że działa, gdy sprawdza scrollTop zarówno na elementach body, jak i html. Jednak aby uniknąć testowania i debugowania, zawsze polegam na bezpiecznym i spójnym pageXOffset / pageYOffset.
gyo

1
wielkie dzięki za poprawną odpowiedź
Michael Paccione

5

Wybrałem rozwiązanie lokalnego przechowywania HTML5 ... Wszystkie moje linki wywołują funkcję, która ustawia to przed zmianą window.location:

localStorage.topper = document.body.scrollTop;

a każda strona ma to w treści onLoad:

  if(localStorage.topper > 0){ 
    window.scrollTo(0,localStorage.topper);
  }

3
Bardziej eleganckie byłoby użycie setItem () i getItem () funkcji localStorage i zamiast tego tworzenie kopii zapasowej pozycji przewijania przy każdym kliknięciu linku, zapisywanie go raz przy opuszczaniu strony: window.addEventListener ("beforeunload", function () {localStorage. setItem ("scrolly", document.documentElement.scrollTop || document.body.scrollTop);});
StanE
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.