2010-10-18 26 views
52

Tengo una capa div con overflow establecido en scroll.javascript: detectar desplazamiento final

Cuando se desplaza hacia la parte inferior de div, quiero ejecutar una función.


+2

cheque esta [jsFiddle demo] (http: //jsfiddle.net/lesson8/hjQca/show/) – Sender

Respuesta

85

La respuesta aceptada era fundamentalmente defectuosa, desde entonces ha sido eliminado. La respuesta correcta es:

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

Probado esto en Firefox, Chrome y Opera. Funciona.

+0

¿Puede decirnos por qué es defectuoso? – SpoonMeiser

+4

Como no detecta ningún fin de desplazamiento, detecta cuándo la parte de la página se desplazó hacia arriba y la altura del contenido div es la misma. Supongamos que tiene el doble de contenido para desplazarse que la altura del div, una vez que ha llegado al final, el valor de scrollTop será el doble del tamaño que offsetHeight del contenedor. La respuesta aceptada comprueba si son iguales y no detectará el final. Mi solución comprueba si el scrollTop + la altura del contenedor es igual (o mayor que, sucede) a toda el área desplazable, ¡ahora esa es la parte inferior! –

+5

@Alex 'window.location.href = 'http: //newurl.com';' o 'window.open ('http://newurl.com');' + el código anterior. –

6

No pude obtener ninguna de las respuestas anteriores para trabajar así que aquí hay una tercera opción que funciona para mí. (Esto se usa con jQuery)

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

Espero que esto ayude a alguien!

+1

funcionó perfecto, Gracias – Amir5000

4

Esto funcionó para mí:

$(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(); 
    } 
}); 

Debe utilizar jQuery 1.6 o superior

3

he encontrado una alternativa que funciona.

Ninguna de estas respuestas funcionó para mí (actualmente está probando en FireFox 22.0), y después de mucha investigación encontré, lo que parece ser, una solución mucho más limpia y directa.

solución implementada:

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

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

Saludos

+0

Gracias, esta es la respuesta correcta! – CORSAIR

+0

Esta fue también la única respuesta que funcionó para mí, ¡gracias! – YtramX

6

Aceptar He aquí una buena y adecuada solución

Tiene una llamada Div con un id="myDiv"

entonces la función 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

Funcionó para mí, probando en Chrome con la tabla – Adrian

+0

¡Gracias! Esto me funciona tanto a Firefox como a Chrome: D – mr5

0

Tome un vistazo a este ejemplo: MDN Element.scrollHeight

le recomiendo que echa un vistazo a este ejemplo: stackoverflow.com/a/24815216... que implementa un manejo de la acción de desplazamiento a través del navegador.

Usted puede utilizar el siguiente fragmento:

//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

Desde innerHeight no funciona en algunas versiones antiguas de IE, clientHeight se puede utilizar:

$(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

creé una solución basada en evento en función de La respuesta de Bjorn Tipling:

(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)); 

Y usas la víspera nt así:

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

Por cierto: es necesario agregar este CSS para javascript para saber cuánto tiempo la página es

html, body { 
    height: 100%; 
} 

Demostración: http://plnkr.co/edit/CCokKfB16iWIMddtWjPC?p=preview

+0

Veo ahora que OP solicitó el final de un div y no el final de la página, pero dejaré la respuesta aquí en caso de que ayude a alguien más. – Pylinux

Cuestiones relacionadas