Tworzę system stronicowania (coś w rodzaju Facebooka), w którym treść ładuje się, gdy użytkownik przewija się do dołu. Wyobrażam sobie, że najlepszym sposobem na to jest znalezienie użytkownika na dole strony i uruchomienie zapytania ajax, aby załadować więcej postów.
Jedynym problemem jest to, że nie wiem, jak sprawdzić, czy użytkownik przewinął do dołu strony za pomocą jQuery. Jakieś pomysły?
Muszę znaleźć sposób, aby sprawdzić, czy użytkownik przewinął do dołu strony za pomocą jQuery.
javascript
jquery
scroll
pagination
Jasio
źródło
źródło
Odpowiedzi:
Użyj
.scroll()
zdarzenia nawindow
:Możesz to przetestować tutaj , to pobiera górny zwój okna, więc o ile jest przewinięte w dół, dodaje wysokość widocznego okna i sprawdza, czy równa się to wysokości całej zawartości (
document
). Jeśli zamiast tego chcesz sprawdzić, czy użytkownik jest blisko dna, wyglądałoby to mniej więcej tak:Możesz przetestować tę wersję tutaj , po prostu dostosuj ją
100
do dowolnego piksela od dołu, który chcesz uruchomić.źródło
console.log()
zamiast ostrzeżenia, czasami powtarza polecenie.Odpowiedź Nicka Cravera działa dobrze, oszczędzając sobie problemu, że wartość
$(document).height()
zależy od przeglądarki.Aby działało na wszystkich przeglądarkach, użyj tej funkcji Jamesa Padolseya :
zamiast
$(document).height()
, aby końcowy kod to:źródło
min
zamiastmax
, zwłaszcza jeśli i tak jest margines, aby uniknąć przypadkowego zapobiegania przewijaniu się użytkownika do tego, co według Ciebie jest na dole strony.Nie jestem do końca pewien, dlaczego nie zostało to jeszcze opublikowane, ale zgodnie z dokumentacją z MDN najprostszym sposobem jest użycie natywnych właściwości javascript:
Zwraca wartość true, gdy znajdziesz się na dole dowolnego przewijalnego elementu. Więc po prostu używając javascript:
scrollHeight
mają szerokie poparcie w przeglądarkach, czyli od 8 do być bardziej precyzyjne, natomiastclientHeight
iscrollTop
są obsługiwane zarówno przez każdego. Nawet np. 6. To powinno być bezpieczne dla różnych przeglądarek.źródło
var isAtBottom = ( logField.scrollHeight - logField.scrollTop <= logField.clientHeight + 50 );
. Jest to przydatne do automatycznego przewijania pola tylko wtedy, gdy jest ono już na dole (aby użytkownik mógł ręcznie zbadać określoną część dziennika w czasie rzeczywistym bez utraty swojego miejsca itp.).200.181819304947
I200
). Dodałem,Math.floor()
aby pomóc sobie z tym poradzić, ale nie wiem, jak wiarygodne to będzie.Math.abs(element.scrollHeight - element.scrollTop - element.clientHeight) <= 3.0
(zamień 3.0 na dowolną tolerancję pikseli, którą uważasz za odpowiednią w danych okolicznościach). Jest to właściwy sposób, ponieważ (A)clientHeight
,scrollTop
iclientHeight
wszystkie są zaokrąglone, co może potencjalnie prowadzić do błędu 3px, jeśli wszystkie wyrównyją, (B) 3 piksele są prawie niewidoczne dla użytkownika, więc użytkownik może pomyśleć, że coś jest nie tak z twoją witryną kiedy „myślą”, że znajdują się na dole strony, a tak naprawdę nie są, i (C) niektóre urządzenia (zwłaszcza bez myszy) mogą mieć dziwne zachowanie podczas przewijania.Dla osób korzystających z rozwiązania Nicka i otrzymujących powtarzające się alerty / zdarzenia, możesz dodać wiersz kodu nad przykładem alertu:
Oznacza to, że kod zostanie uruchomiony tylko wtedy, gdy znajdziesz się w odległości 100 pikseli od dolnej krawędzi dokumentu. Nie powtórzy się, jeśli przewiniesz w górę, a następnie w dół, co może, ale nie musi być przydatne, w zależności od tego, do czego używasz kodu Nicka.
źródło
Oprócz doskonale przyjętej odpowiedzi Nicka Cravera możesz zdławić zdarzenie przewijania, aby nie było tak często uruchamiane, zwiększając w ten sposób wydajność przeglądarki :
źródło
Odpowiedź Nicka Cravera musi zostać nieco zmodyfikowana, aby działała na iOS 6 Safari Mobile i powinna brzmieć:
Wymiana pieniędzy $ (okno) .height () do window.innerHeight należy zrobić, ponieważ gdy pasek adresu jest ukryty dodatkowe 60px są dodawane do wysokości okna, ale stosując
$(window).height()
ma nie odzwierciedlać tę zmianę, podczas korzystaniawindow.innerHeight
robi.Uwaga :
window.innerHeight
Właściwość obejmuje również wysokość poziomego paska przewijania (jeśli jest renderowany), w przeciwieństwie do tego,$(window).height()
który nie obejmuje wysokości poziomego paska przewijania. Nie stanowi to problemu w Mobile Safari, ale może powodować nieoczekiwane zachowanie w innych przeglądarkach lub przyszłych wersjach Mobile Safari. Zmiana==
na>=
może rozwiązać ten problem w najczęstszych przypadkach użycia.Przeczytaj więcej o
window.innerHeight
nieruchomości tutajźródło
Oto dość proste podejście
const didScrollToBottom = elm.scrollTop + elm.clientHeight == elm.scrollHeight
Przykład
Gdzie
elm
jest element pobrany z npdocument.getElementById
.źródło
Oto fragment kodu, który pomoże ci debugować kod. Przetestowałem powyższe odpowiedzi i stwierdziłem, że są wadliwe. Mam następujące testy w Chrome, IE, Firefox, IPad (Safari). Nie mam żadnych innych zainstalowanych do testowania ...
Być może istnieje prostsze rozwiązanie, ale zatrzymałem się w punkcie, w którym TO DZIAŁAŁO
Jeśli nadal masz problemy z jakąś nieuczciwą przeglądarką, oto kod ułatwiający debugowanie:
Mam nadzieję, że to pozwoli komuś zaoszczędzić trochę czasu.
źródło
var docElement = document.documentElement; var winElement = window
winElement.pageYOffset
ciebie możesz również użyćwinElement.scrollY
.Sprawdź tę odpowiedź
Możesz
footerHeight - document.body.offsetHeight
sprawdzić, czy znajdujesz się w pobliżu stopkiźródło
Oblicza pasek przewijania odległości do dołu elementu. Równa się 0, jeśli pasek przewijania osiągnął dół.
źródło
To są moje dwa centy:
źródło
$(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight
=>$(this).scrollTop() + $(this).outerHeight(true) >= $(this)[0].scrollHeight
Pure JS z przeglądarką i zapowiadaniem (całkiem niezła wydajność )
Demo: http://jsbin.com/geherovena/edit?js,output
PS:
Debouncer
,getScrollXY
,getDocHeight
nie jest napisane przeze mniePo prostu pokazuję, jak to działa i jak to zrobię
źródło
Moje rozwiązanie w zwykłym js:
źródło
Wypróbuj to dla warunku dopasowania, jeśli przewiń do dolnego końca
źródło
Nick odpowiada dobrze, ale będziesz mieć funkcje, które będą się powtarzać podczas przewijania lub nie będą działać, jeśli użytkownik powiększy okno. Wymyśliłem łatwą poprawkę właśnie matematyki. Na pierwszej wysokości i działa ona tak, jak zakładano.
źródło
Możesz wypróbować następujący kod,
źródło
Daje to dokładne wyniki podczas sprawdzania przewijalnego elementu (tzn. Nie
window
):offsetHeight
powinna podawać rzeczywistą widoczną wysokość elementu (w tym wypełnienie, margines i paski przewijania) iscrollHeight
jest to cała wysokość elementu, w tym niewidoczne (przepełnione) obszary.jQuery
„s.outerHeight()
powinno dać podobny wynik do JS użytkownika.offsetHeight
- dokumentację w MDN naoffsetHeight
jest jasne o wsparcie cross-browser. Aby objąć więcej opcji, jest to bardziej kompletne:źródło
Math.floor(element.scrollTop) === element.scrollHeight - element.offsetHeight
na wypadek, gdyby scrollTop był liczbą dziesiętną, bez której nie zadziałaMath.floor()
Wszystkie te rozwiązania nie działają dla mnie w Firefoksie i Chrome, więc używam niestandardowych funkcji Milesa O'Keefe i medera omuralieva w następujący sposób:
źródło
Oto moje dwa centy, ponieważ zaakceptowana odpowiedź nie działała dla mnie.
źródło
Zamiast nasłuchiwać zdarzenia przewijania, użycie Intersection Observer jest niedrogim narzędziem do sprawdzania, czy ostatni element był widoczny w okienku ekranu (to znaczy, że użytkownik został przewinięty do dołu). Obsługuje także IE7 z polifillem .
źródło
.observe(...)
nasłuchiwania zdarzenia, na przykład gdy użytkownik unosi / dotknie kontenera przewijania, aby nie zadziałał natychmiast.Pokażę approch bez JQuery. Prosta funkcja JS:
Krótki przykład jak go używać:
źródło
Użyłem @ddanone answear i dodałem połączenie Ajax.
}
źródło
Aby zatrzymać powtarzające się ostrzeżenie o odpowiedzi Nicka
źródło
Google Chrome podaje pełną wysokość strony, jeśli zadzwonisz
$(window).height()
Zamiast tego użyj,
window.innerHeight
aby odzyskać wysokość okna. Niezbędne sprawdzenie powinno być:źródło
Najwyraźniej działało dla mnie „ciało”, a nie „okno” jak to:
do kompatybilności z różnymi przeglądarkami użyj:
a następnie zamiast $ (document) .height () wywołaj funkcję getheight ()
do użytku w pobliżu dna:
źródło