Controlla se un utente ha fatto scorrere verso il basso


668

Sto creando un sistema di impaginazione (un po 'come Facebook) in cui il contenuto viene caricato quando l'utente scorre verso il basso. Immagino che il modo migliore per farlo sia trovare quando l'utente si trova in fondo alla pagina ed eseguire una query Ajax per caricare più post.

L'unico problema è che non so come verificare se l'utente ha scorrere fino alla fine della pagina con jQuery. Qualche idea?

Devo trovare un modo per verificare quando l'utente è passato alla fine della pagina con jQuery.


È divertente, sto cercando di capire quale funzione viene chiamata quando scorro verso il basso, quindi posso bloccare questa "caratteristica" esasperante.
endolith

Per una soluzione React.js, questo link potrebbe aiutare: stackoverflow.com/a/53158893/4265546
raksheetbhat

Risposte:


1024

Usa l' .scroll()evento on window, in questo modo:

$(window).scroll(function() {
   if($(window).scrollTop() + $(window).height() == $(document).height()) {
       alert("bottom!");
   }
});

Puoi provarlo qui , questo prende lo scorrimento superiore della finestra, quindi quanto è scorrere verso il basso, aggiunge l'altezza della finestra visibile e controlla se questo è uguale all'altezza del contenuto complessivo ( document). Se invece volessi verificare se l'utente si trova vicino al fondo, sarebbe simile a questo:

$(window).scroll(function() {
   if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
       alert("near bottom!");
   }
});

Puoi testare quella versione qui , basta regolarla 100su qualsiasi pixel dal basso che vuoi attivare.


32
Come al solito ci arrivi prima di me. Ad ogni modo, al PO, se hai un contenitore di messaggi, usa il suo ID invece di "finestra", inoltre, potresti voler cambiare l'ultimo .height () per scrollHeight
Christian,

4
Firefox chiama alert ("bottom!"); molte volte (funziona bene con Chrome e Safari)
Marco Matarazzi,

3
è un po 'buggy, se fai un console.log()avviso invece che a volte ripete il comando.
Jürgen Paul,

19
La buona combinazione di @KevinVella Vella è di usarla con _.debounce () nell'utilità di sottolineatura per impedirne l'attivazione fino a quando l'utente non smette di scorrere - underscorejs.org/#debounce -
JohnnyFaldo,

3
@NickCraver è disponibile qualche implementazione js pura?
Dewsworld,

116

La risposta di Nick Craver funziona bene, risparmiando il problema che il valore di $(document).height()varia a seconda del browser.

Per farlo funzionare su tutti i browser, usa questa funzione di James Padolsey :

function getDocHeight() {
    var D = document;
    return Math.max(
        D.body.scrollHeight, D.documentElement.scrollHeight,
        D.body.offsetHeight, D.documentElement.offsetHeight,
        D.body.clientHeight, D.documentElement.clientHeight
    );
}

al posto di $(document).height(), in modo che il codice finale sia:

$(window).scroll(function() {
       if($(window).scrollTop() + $(window).height() == getDocHeight()) {
           alert("bottom!");
       }
   });

6
Ha aggiornato con una funzione di versione leggermente compressa getDocHeight () {var D = document; return Math.max (D.body.scrollHeight, D.documentElement.scrollHeight, D.body.offsetHeight, D.documentElement.offsetHeight, D.body.clientHeight, D.documentElement.clientHeight); }
Estratto il

che mi avvisa quando raggiungo la parte superiore, non quella inferiore (Chrome).
Damien Roche,

Potrebbe essere meglio usare mininvece di max, specialmente se c'è comunque un margine, per evitare che l'utente acceda per sbaglio a quello che pensi sia il fondo della pagina.
Solomon Ucko,

104

Non sono esattamente sicuro del perché questo non sia stato ancora pubblicato, ma secondo la documentazione di MDN , il modo più semplice è utilizzare le proprietà javascript native:

element.scrollHeight - element.scrollTop === element.clientHeight

Restituisce vero quando sei in fondo a qualsiasi elemento scorrevole. Quindi semplicemente usando javascript:

element.addEventListener('scroll', function(event)
{
    var element = event.target;
    if (element.scrollHeight - element.scrollTop === element.clientHeight)
    {
        console.log('scrolled');
    }
});

scrollHeighthanno un ampio sostegno nei browser, da IE 8 per essere più precisi, mentre clientHeighte scrollTopsono entrambi supportati da tutti. Anche ie 6. Questo dovrebbe essere sicuro tra browser.


1
Si noti che in alcune situazioni questo potrebbe non essere il caso. Firefox 47 riporta un client textarea Altezza come 239 mentre l'equazione sopra fornisce 253 quando si scorre verso il basso. Forse imbottitura / bordo o qualcosa lo sta influenzando? Ad ogni modo, l'aggiunta di un po 'di spazio di manovra non farebbe male, come var isAtBottom = ( logField.scrollHeight - logField.scrollTop <= logField.clientHeight + 50 );. Ciò è utile per lo scorrimento automatico di un campo solo se già in fondo (quindi l'utente può esaminare manualmente una parte specifica di un registro in tempo reale senza perdere la propria posizione, ecc.).
Beejor,

Vorrei aggiungere che è possibile che restituisca falsi negativi poiché una parte potrebbe restituire un piccolo decimale mentre l'altra parte restituisce un numero intero (ad es. 200.181819304947E 200). Ho aggiunto un Math.floor()per aiutare ad affrontarlo, ma non so quanto sarà affidabile.
Hanna,

1
Per me, questo non funziona su più browser. Ottengo risultati completamente diversi su Chrome rispetto a Firefox.
Tadej,

1
Ho provato questo sull'elemento <body>, e questo si attiva quando il browser scorre in alto, non in basso.
Chris Sobolewski,

10
Math.abs(element.scrollHeight - element.scrollTop - element.clientHeight) <= 3.0(sostituisci 3.0 con qualsiasi tolleranza di pixel ritieni appropriata per le tue circostanze). Questa è la strada da percorrere perché (A) clientHeight, scrollTope clientHeightsono tutti arrotondati che potrebbero potenzialmente portare a un errore di 3px se tutti allineati, (B) 3 pixel non sono quasi visibili all'utente, quindi l'utente potrebbe pensare che qualcosa non vada nel tuo sito quando "pensano" si trovano in fondo alla pagina, mentre in realtà non lo sono, e (C) alcuni dispositivi (specialmente quelli senza mouse) possono avere un comportamento strano durante lo scorrimento.
Jack Giffin,

50

Per coloro che utilizzano la soluzione di Nick e ricevono ripetuti avvisi / eventi, è possibile aggiungere una riga di codice sopra l'esempio di avviso:

$(window).scroll(function() {
   if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
       $(window).unbind('scroll');
       alert("near bottom!");
   }
});

Ciò significa che il codice verrà attivato solo la prima volta che ci si trova entro 100 px dalla parte inferiore del documento. Non si ripeterà se si scorre di nuovo verso l'alto e poi verso il basso, il che può essere utile o meno a seconda dell'uso del codice di Nick.


1
Avrei solo commentato e detto dov'è quella riga di codice poiché è rilevante per la risposta di qualcun altro ma +1 per l'intenzione!
Nate-Wilkins,

Spiacenti, non riesco (e ancora non riesco) a vedere come aggiungere un commento alla risposta (come posso vedere qui)?
Tim Carr

Sì, i nuovi utenti non possono aggiungere un commento ai post se non si ottiene più rappresentante.
Nate-Wilkins,

All'esterno il primo se potessi mettere un altro se questo verifica se la modifica che volevi fosse fatta dallo script, diciamo che una classe è stata applicata a un div. Ciò renderebbe il secondo nidificato se non eseguito se è già stato eseguito.
1934286,

come posso selezionare un ID div specifico anziché l'intera finestra?
James Smith,

40

Oltre all'eccellente risposta accettata da Nick Craver, puoi limitare l'evento scroll in modo che non venga attivato così frequentemente aumentando così le prestazioni del browser :

var _throttleTimer = null;
var _throttleDelay = 100;
var $window = $(window);
var $document = $(document);

$document.ready(function () {

    $window
        .off('scroll', ScrollHandler)
        .on('scroll', ScrollHandler);

});

function ScrollHandler(e) {
    //throttle event:
    clearTimeout(_throttleTimer);
    _throttleTimer = setTimeout(function () {
        console.log('scroll');

        //do work
        if ($window.scrollTop() + $window.height() > $document.height() - 100) {
            alert("near bottom!");
        }

    }, _throttleDelay);
}

Dovrebbe probabilmente essere sottolineato che ciò richiede Underscore.js: underscorejs.org . È un ottimo punto, però. L'evento scroll dovrebbe essere quasi sempre limitato per evitare seri problemi di prestazioni.
Jude Osborn,

Forse sono solo io e potrei usare alcuni benchmark, ma non mi piace l'idea di invocare clearTimeout e setTimeout su ogni evento scroll. Vorrei pubblicare 1 setTimeout e aggiungere alcune protezioni in quel gestore. Probabilmente è solo una micro-ottimizzazione (se non del tutto).
Smorfia di disperazione,

Questa è un'aggiunta davvero ordinata! Mi viene in mente un ulteriore miglioramento. Attualmente la funzione che controlla l'altezza non verrà eseguita se l'utente continua a scorrere. Se questo è un problema (ad es. Si desidera attivare la funzione quando l'utente scorre a metà verso il basso, indipendentemente dal fatto che continui a scorrere), è possibile assicurarsi facilmente che la funzione venga effettivamente richiamata, vietando comunque più chiamate durante l'intervallo scelto. Ecco un esempio per dimostrarlo. gist.github.com/datacarl/7029558
datacarl

Che cosa? Richiamare un carico di macchinari per impedire un semplice calcolo? Non vedo come sia più efficiente
Rambatino,

37

La risposta di Nick Craver deve essere leggermente modificata per funzionare su iOS 6 Safari Mobile e dovrebbe essere:

$(window).scroll(function() {
   if($(window).scrollTop() + window.innerHeight == $(document).height()) {
       alert("bottom!");
   }
});

Cambiare $ .height (finestra) () per window.innerHeight dovrebbe essere fatto, perché quando la barra degli indirizzi è nascosto un ulteriore 60px vengono aggiunti alla altezza della finestra, ma utilizzando $(window).height()non senza riflettere questo cambiamento, pur utilizzando window.innerHeightlo fa.

Nota : la window.innerHeightproprietà include anche l'altezza della barra di scorrimento orizzontale (se è renderizzata), diversamente da quella $(window).height()che non includerà l'altezza della barra di scorrimento orizzontale. Questo non è un problema in Mobile Safari, ma potrebbe causare comportamenti imprevisti in altri browser o versioni future di Mobile Safari. Passare ==a >=potrebbe risolvere questo problema per i casi d'uso più comuni.

Maggiori informazioni sulla window.innerHeightproprietà qui


window.innerHeight ha avuto più senso per quello che stavo cercando di realizzare grazie!
Amir5000,

Come ottenere l'altezza rimanente dopo lo scorrimento?
OPV,

21

Ecco un approccio abbastanza semplice

const didScrollToBottom = elm.scrollTop + elm.clientHeight == elm.scrollHeight

Esempio

elm.onscroll = function() {
    if(elm.scrollTop + elm.clientHeight == elm.scrollHeight) {
        // User has scrolled to the bottom of the element
    }
}

Da dove elmviene recuperato un elemento, ad es document.getElementById.


17

Ecco un pezzo di codice che ti aiuterà a eseguire il debug del tuo codice, ho testato le risposte sopra e ho trovato che erano buggy. Ho testato i seguenti su Chrome, IE, Firefox, IPad (Safari). Non ne ho altri installati per testare ...

<script type="text/javascript">
   $(function() {
      $(window).scroll(function () {
         var docElement = $(document)[0].documentElement;
         var winElement = $(window)[0];

         if ((docElement.scrollHeight - winElement.innerHeight) == winElement.pageYOffset) {
            alert('bottom');
         }
      });
   });
</script>

Ci può essere una soluzione più semplice, ma mi sono fermato al punto in cui HA FUNZIONATO

Se hai ancora problemi con alcuni browser non autorizzati, ecco un codice per aiutarti a eseguire il debug:

<script type="text/javascript">
   $(function() {
      $(window).scroll(function () {
         var docElement = $(document)[0].documentElement;
         var details = "";
         details += '<b>Document</b><br />';
         details += 'clientHeight:' + docElement.clientHeight + '<br />';
         details += 'clientTop:' + docElement.clientTop + '<br />';
         details += 'offsetHeight:' + docElement.offsetHeight + '<br />';
         details += 'offsetParent:' + (docElement.offsetParent == null) + '<br />';
         details += 'scrollHeight:' + docElement.scrollHeight + '<br />';
         details += 'scrollTop:' + docElement.scrollTop + '<br />';

         var winElement = $(window)[0];
         details += '<b>Window</b><br />';
         details += 'innerHeight:' + winElement.innerHeight + '<br />';
         details += 'outerHeight:' + winElement.outerHeight + '<br />';
         details += 'pageYOffset:' + winElement.pageYOffset + '<br />';
         details += 'screenTop:' + winElement.screenTop + '<br />';
         details += 'screenY:' + winElement.screenY + '<br />';
         details += 'scrollY:' + winElement.scrollY + '<br />';

         details += '<b>End of page</b><br />';
         details += 'Test:' + (docElement.scrollHeight - winElement.innerHeight) + '=' + winElement.pageYOffset + '<br />';
         details += 'End of Page? ';
         if ((docElement.scrollHeight - winElement.innerHeight) == winElement.pageYOffset) {
             details += 'YES';
         } else {
             details += 'NO';
         }

         $('#test').html(details);
      });
   });
</script>
<div id="test" style="position: fixed; left:0; top: 0; z-index: 9999; background-color: #FFFFFF;">

Spero che questo salverà qualcuno un po 'di tempo.


Migliore risposta per Vanilla js, nessuna soluzione jQuery. Usavar docElement = document.documentElement; var winElement = window
jperelli il

Questo nel 2019. Invece di winElement.pageYOffsette puoi anche usare winElement.scrollY.
Noel Abrahams,

15

Si prega di controllare questa risposta

 window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
       console.log("bottom");
    }
};

Puoi fare footerHeight - document.body.offsetHeightper vedere se sei vicino al piè di pagina o hai raggiunto il piè di pagina


12
var elemScrolPosition = elem.scrollHeight - elem.scrollTop - elem.clientHeight;

Calcola la barra di scorrimento della distanza nella parte inferiore dell'elemento. Uguale a 0, se la barra di scorrimento ha raggiunto il fondo.


1
Ho fatto quanto segue e ho lavorato perfettamente. Grazie. var shouldScroll = (elem.scrollHeight - elem.scrollTop - elem.clientHeight) == 0;
Jiminssy,

11

Questi sono i miei due centesimi:

$('#container_element').scroll( function(){
        console.log($(this).scrollTop()+' + '+ $(this).height()+' = '+ ($(this).scrollTop() + $(this).height())   +' _ '+ $(this)[0].scrollHeight  );
        if($(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight){
            console.log('bottom found');
        }
    });

Ho provato a usare la tua soluzione, funziona bene ma nei casi in cui l'elemento ha un'imbottitura - non funziona perché calcola l'altezza pura dell'elemento, senza includere l'imbottitura, per risolvere questo ho cambiato questo $(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight=>$(this).scrollTop() + $(this).outerHeight(true) >= $(this)[0].scrollHeight
Taras Chernata

6

JS puro con cross-browser e debouncing ( prestazioni abbastanza buone )

var CheckIfScrollBottom = debouncer(function() {
    if(getDocHeight() == getScrollXY()[1] + window.innerHeight) {
       console.log('Bottom!');
    }
},500);

document.addEventListener('scroll',CheckIfScrollBottom);

function debouncer(a,b,c){var d;return function(){var e=this,f=arguments,g=function(){d=null,c||a.apply(e,f)},h=c&&!d;clearTimeout(d),d=setTimeout(g,b),h&&a.apply(e,f)}}
function getScrollXY(){var a=0,b=0;return"number"==typeof window.pageYOffset?(b=window.pageYOffset,a=window.pageXOffset):document.body&&(document.body.scrollLeft||document.body.scrollTop)?(b=document.body.scrollTop,a=document.body.scrollLeft):document.documentElement&&(document.documentElement.scrollLeft||document.documentElement.scrollTop)&&(b=document.documentElement.scrollTop,a=document.documentElement.scrollLeft),[a,b]}
function getDocHeight(){var a=document;return Math.max(a.body.scrollHeight,a.documentElement.scrollHeight,a.body.offsetHeight,a.documentElement.offsetHeight,a.body.clientHeight,a.documentElement.clientHeight)}

Demo: http://jsbin.com/geherovena/edit?js,output

PS: Debouncer, getScrollXY, getDocHeightnon è scritto da me

Mostro solo come funziona e come lo farò


Perfetto. Testato su Firefox e Chrome
Erlisar Vasquez il

Ottengo il seguente errore: 3 argomenti previsti, ma 2. Non è stato fornito un argomento "c".
Söber

6

La mia soluzione in js semplice:

let el=document.getElementById('el');
el.addEventListener('scroll', function(e) {
    if (this.scrollHeight - this.scrollTop - this.clientHeight<=0) {
        alert('Bottom');
    }
});
#el{
  width:400px;
  height:100px;
  overflow-y:scroll;
}
<div id="el">
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
<div>content</div>
</div>


4

Prova questo per condizioni di corrispondenza se scorri fino alla fine

if ($(this)[0].scrollHeight - $(this).scrollTop() == 
    $(this).outerHeight()) {

    //code for your custom logic

}

3

Nick risponde bene ma avrai funzioni che si ripetono durante lo scorrimento o non funzioneranno affatto se l'utente ha la finestra ingrandita. Ho escogitato una soluzione semplice solo matematicamente intorno alla prima altezza e funziona esattamente come previsto.

    if (Math.round($(window).scrollTop()) + $(window).innerHeight() == $(document).height()){
    loadPagination();
    $(".go-up").css("display","block").show("slow");
}

3

Puoi provare il seguente codice,

$("#dashboard-scroll").scroll(function(){
    var ele = document.getElementById('dashboard-scroll');
    if(ele.scrollHeight - ele.scrollTop === ele.clientHeight){
       console.log('at the bottom of the scroll');
    }
});

2

Ciò fornisce risultati accurati, quando si controlla un elemento scorrevole (cioè non window):

// `element` is a native JS HTMLElement
if ( element.scrollTop == (element.scrollHeight - element.offsetHeight) )
    // Element scrolled to bottom

offsetHeightdovrebbe fornire l' altezza visibile effettiva di un elemento (inclusi riempimento, margine e barre di scorrimento) ed scrollHeightè l' intera altezza di un elemento comprese le aree invisibili (traboccate).

jQuery's .outerHeight()dovrebbe dare risultato simile a JS di .offsetHeight- la documentazione in MDN per offsetHeightè poco chiaro circa il suo supporto cross-browser. Per coprire più opzioni, questo è più completo:

var offsetHeight = ( container.offsetHeight ? container.offsetHeight : $(container).outerHeight() );
if  ( container.scrollTop == (container.scrollHeight - offsetHeight) ) {
   // scrolled to bottom
}

prova Math.floor(element.scrollTop) === element.scrollHeight - element.offsetHeightnel caso in cui scrollTop sia un decimale senza il quale non funzioneràMath.floor()
Michail Michailidis

2

Invece di ascoltare l'evento scroll, usare Intersection Observer è quello economico per verificare se l'ultimo elemento era visibile nella finestra (ciò significa che l'utente è stato fatto scorrere verso il basso). Supportava anche IE7 con il polyfill .

var observer = new IntersectionObserver(function(entries){
   if(entries[0].isIntersecting === true)
      console.log("Scrolled to the bottom");
   else
      console.log("Not on the bottom");
}, {
   root:document.querySelector('#scrollContainer'),
   threshold:1 // Trigger only when whole element was visible
});

observer.observe(document.querySelector('#scrollContainer').lastElementChild);
#scrollContainer{
  height: 100px;
  overflow: hidden scroll;
}
<div id="scrollContainer">
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
  <div>Item 4</div>
  <div>Item 5</div>
  <div>Item 6</div>
  <div>Item 7</div>
  <div>Item 8</div>
  <div>Item 9</div>
  <div>Item 10</div>
</div>


Il problema con Intersection Observer è che se la finestra iniziale è relativamente piccola (dire layout di base prima di recuperare le immagini senza barra di scorrimento), la richiamata dell'osservatore viene immediatamente attivata. L'ascoltatore di scorrimento in realtà attende che una persona scorra. E la barra di scorrimento non verrà visualizzata prima che venga recuperata la prima serie di immagini e così via. Quindi Intersection Observer non è tutto in un'unica soluzione.
Aleks

@Aleks Puoi chiamare .observe(...)un listener di eventi come quando l'utente passa con il mouse / tocca il tuo contenitore di scorrimento in modo che non si attivi immediatamente.
StefansArya,

1

Tutte queste soluzioni non funzionano su Firefox e Chrome, quindi uso le funzioni personalizzate di Miles O'Keefe e meder omuraliev in questo modo:

function getDocHeight()
{
    var D = document;
    return Math.max(
        D.body.scrollHeight, D.documentElement.scrollHeight,
        D.body.offsetHeight, D.documentElement.offsetHeight,
        D.body.clientHeight, D.documentElement.clientHeight
    );
}

function getWindowSize()
{
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return [myWidth, myHeight];
}

$(window).scroll(function()
{
    if($(window).scrollTop() + getWindowSize()[1] == getDocHeight())
    {
        alert("bottom!");
    }
});

1

Ecco i miei due centesimi poiché la risposta accettata non ha funzionato per me.

var documentAtBottom = (document.documentElement.scrollTop + window.innerHeight) >= document.documentElement.scrollHeight;

0

Vorrei mostrare l'approvazione senza JQuery. Semplice funzione JS:

function isVisible(elem) {
  var coords = elem.getBoundingClientRect();
  var topVisible = coords.top > 0 && coords.top < 0;
  var bottomVisible = coords.bottom < shift && coords.bottom > 0;
  return topVisible || bottomVisible;
}

Breve esempio su come usarlo:

var img = document.getElementById("pic1");
    if (isVisible(img)) { img.style.opacity = "1.00";  }

5
Questo non risponde alla domanda. La domanda era come rilevare che gli utenti hanno fatto scorrere la finestra fino in fondo. Il tuo codice sta controllando se un particolare elemento è in vista.
Peter Hall,

0

Ho usato @ddanone Answear e ho aggiunto la chiamata Ajax.

$('#mydiv').on('scroll', function(){
  function infiniScroll(this);
});

function infiniScroll(mydiv){
console.log($(mydiv).scrollTop()+' + '+ $(mydiv).height()+' = '+ ($(mydiv).scrollTop() + $(mydiv).height())   +' _ '+ $(mydiv)[0].scrollHeight  );

if($(mydiv).scrollTop() + $(mydiv).height() == $(mydiv)[0].scrollHeight){
    console.log('bottom found');
    if(!$.active){ //if there is no ajax call active ( last ajax call waiting for results ) do again my ajax call
        myAjaxCall();
    }
}

}


0

Per interrompere il ripetuto allarme della risposta di Nick

ScrollActivate();

function ScrollActivate() {
    $(window).on("scroll", function () {
        if ($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
            $(window).off("scroll");
            alert("near bottom!");
        }
    });
}

0

Google Chrome fornisce l'intera altezza della pagina se chiami $(window).height()

Invece, usa window.innerHeight per recuperare l'altezza della tua finestra. Il controllo necessario dovrebbe essere:

if($(window).scrollTop() + window.innerHeight > $(document).height() - 50) {
    console.log("reached bottom!");
}

0

Apparentemente ciò che ha funzionato per me era "corpo" e non "finestra" in questo modo:

$('body').scroll(function() {


 if($('body').scrollTop() + $('body').height() == $(document).height()) {
     //alert at buttom
 }
 });

per la compatibilità tra browser utilizzare:

  function getheight(){
    var doc = document;
    return  Math.max(
        doc.body.scrollHeight, doc.documentElement.scrollHeight,
        doc.body.offsetHeight, doc.documentElement.offsetHeight,
        doc.body.clientHeight, doc.documentElement.clientHeight

        );
   }

e quindi invece di $ (document) .height () chiama la funzione getheight ()

$('body').scroll(function() {


   if($('body').scrollTop() + $('body').height() == getheight()  ) {
     //alert at bottom
 }
});

per un uso quasi dal basso:

$('body').scroll(function() {


if($('body').scrollTop() + $('body').height() > getheight() -100 ) {
    //alert near bottom
 }
 });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.