2010-10-18 12 views
52

Ho uno strato div con overflow impostato su scroll.javascript: detect scroll end

Quando si scorre verso la parte inferiore del div, voglio eseguire una funzione.


+2

controllo questo [jsfiddle demo] (http: //jsfiddle.net/lesson8/hjQca/show/) – Sender

risposta

85

La risposta accettata era fondamentalmente errata, da allora è stato cancellato. La risposta corretta è:

function scrolled(e) { 
    if (myDiv.offsetHeight + myDiv.scrollTop >= myDiv.scrollHeight) { 
    scrolledToBottom(e); 
    } 
} 

Testato in Firefox, Chrome e Opera. Funziona.

+0

Puoi farci sapere perché è difettoso? – SpoonMeiser

+4

Poiché non rileva affatto lo scorrimento, rileva quando quando la parte della pagina scorre verso l'alto e l'altezza del div contenente è la stessa! Supponiamo di avere il doppio del contenuto da scorrere rispetto all'altezza del div, una volta raggiunta la fine, il valore scrollTop sarà il doppio delle dimensioni dell'offsetHeight del contenitore. La risposta accettata verifica se questi sono uguali e non rileva la fine. La mia soluzione controlla se lo scrollTop + l'altezza del contenitore è uguale a (o maggiore di, succede) l'intera area scorrevole, ora è il fondo! –

+5

@Alex 'window.location.href = 'http: //newurl.com';' o 'window.open ('http://newurl.com');' + il codice sopra. –

6

Non ho potuto ottenere nessuna delle risposte precedenti per funzionare quindi ecco una terza opzione che funziona per me! (Questo è usato con jQuery)

if (($(window).innerHeight() + $(window).scrollTop()) >= $("body").height()) { 
    //do stuff 
} 

Spero che questo aiuti chiunque!

+1

ha funzionato perfettamente, Grazie – Amir5000

4

questo ha funzionato per me:

$(window).scroll(function() { 
    buffer = 40 // # of pixels from bottom of scroll to fire your function. Can be 0 
    if ($(".myDiv").prop('scrollHeight') - $(".myDiv").scrollTop() <= $(".myDiv").height() + buffer) { 
    doThing(); 
    } 
}); 

Deve usare jQuery 1.6 o superiore

3

ho trovato un'alternativa che funziona.

Nessuna di queste risposte ha funzionato per me (attualmente in prova in FireFox 22.0) e, dopo molte ricerche, ho trovato, a quanto pare, una soluzione molto più pulita e immediata.

soluzione implementata:

function IsScrollbarAtBottom() { 
    var documentHeight = $(document).height(); 
    var scrollDifference = $(window).height() + $(window).scrollTop(); 
    return (documentHeight == scrollDifference); 
} 

risorse: http://jquery.10927.n7.nabble.com/How-can-we-find-out-scrollbar-position-has-reached-at-the-bottom-in-js-td145336.html

saluti

+0

Grazie, questa è la risposta corretta! – CORSAIR

+0

Questa è stata anche l'unica risposta che ha funzionato per me, grazie! – YtramX

6

OK Ecco una buona e corretta soluzione

Hai una chiamata Div con una id="myDiv"

quindi la funzione g OES.

function GetScrollerEndPoint() 
{ 
    var scrollHeight = $("#myDiv").prop('scrollHeight'); 
    var divHeight = $("#myDiv").height(); 
    var scrollerEndPoint = scrollHeight - divHeight; 

    var divScrollerTop = $("#myDiv").scrollTop(); 
    if(divScrollerTop === scrollerEndPoint) 
    { 
     //Your Code 
     //The Div scroller has reached the bottom 
    } 
} 
+0

Ha funzionato per me, testando su Chrome con la tabella – Adrian

+0

Grazie! Questo funziona per me sia per Firefox che per Chrome: D – mr5

0

Date un'occhiata a questo esempio: MDN Element.scrollHeight

vi consiglio di controllare questo esempio: stackoverflow.com/a/24815216... che implementa una gestione per l'azione di scorrimento cross-browser.

È possibile utilizzare il seguente frammento:

//attaches the "scroll" event 
$(window).scroll(function (e) { 
    var target = e.currentTarget, 
     scrollTop = target.scrollTop || window.pageYOffset, 
     scrollHeight = target.scrollHeight || document.body.scrollHeight; 
    if (scrollHeight - scrollTop === $(target).innerHeight()) { 
     console.log("► End of scroll"); 
    } 
}); 
0

Dal innerHeight non funziona in alcune vecchie versioni di IE, clientHeight può essere utilizzato:

$(window).scroll(function (e){ 
    var body = document.body;  
    //alert (body.clientHeight); 
    var scrollTop = this.pageYOffset || body.scrollTop; 
    if (body.scrollHeight - scrollTop === parseFloat(body.clientHeight)) { 
     loadMoreNews(); 
    } 
}); 
1

ho creato una soluzione basata evento sulla base di Bjorn Tipling's answer:

(function(doc){ 
    'use strict'; 

    window.onscroll = function (event) { 
     if (isEndOfElement(doc.body)){ 
      sendNewEvent('end-of-page-reached'); 
     } 
    }; 

    function isEndOfElement(element){ 
     //visible height + pixel scrolled = total height 
     return element.offsetHeight + element.scrollTop >= element.scrollHeight; 
    } 

    function sendNewEvent(eventName){ 
     var event = doc.createEvent('Event'); 
     event.initEvent(eventName, true, true); 
     doc.dispatchEvent(event); 
    } 
}(document)); 

E tu usi la vigilia nt in questo modo:

document.addEventListener('end-of-page-reached', function(){ 
    console.log('you reached the end of the page'); 
}); 

BTW: è necessario aggiungere questo CSS per javascript sapere quanto tempo la pagina è

html, body { 
    height: 100%; 
} 

Demo: http://plnkr.co/edit/CCokKfB16iWIMddtWjPC?p=preview

+0

Ora vedo che l'OP chiedeva la fine di un div e non la fine della pagina, ma lascerò qui la risposta nel caso in cui aiuti qualcun altro. – Pylinux