Estoy haciendo un sistema de paginación (como Facebook) donde el contenido se carga cuando el usuario se desplaza hacia abajo. Me imagino que la mejor manera de hacerlo es encontrar cuándo el usuario está en la parte inferior de la página y ejecutar una consulta ajax para cargar más publicaciones.
El único problema es que no sé cómo verificar si el usuario se ha desplazado al final de la página con jQuery. ¿Algunas ideas?
Necesito encontrar una manera de verificar cuándo el usuario se ha desplazado al final de la página con jQuery.
javascript
jquery
scroll
pagination
Johnny
fuente
fuente
Respuestas:
Use el
.scroll()
evento enwindow
, así:Puede probarlo aquí , esto toma el desplazamiento superior de la ventana, así que cuánto se desplaza hacia abajo, agrega la altura de la ventana visible y verifica si eso es igual a la altura del contenido general (
document
). Si quisieras comprobar si el usuario está cerca de la parte inferior, se vería así:Puede probar esa versión aquí , solo ajústela
100
a cualquier píxel desde la parte inferior que desee activar.fuente
console.log()
alerta en lugar de una alerta, a veces repite el comando.La respuesta de Nick Craver funciona bien, evite el problema de que el valor de
$(document).height()
varía según el navegador.Para que funcione en todos los navegadores, use esta función de James Padolsey :
en lugar de
$(document).height()
, de modo que el código final es:fuente
min
lugar de hacerlomax
, especialmente si hay un margen de todos modos, para evitar evitar accidentalmente que el usuario se desplace hacia lo que crees que es la parte inferior de la página.No estoy exactamente seguro de por qué esto aún no se ha publicado, pero según la documentación de MDN , la forma más sencilla es mediante el uso de propiedades de JavaScript nativas:
Devuelve verdadero cuando está en la parte inferior de cualquier elemento desplazable. Entonces simplemente usando javascript:
scrollHeight
tienen un amplio soporte en navegadores, es decir, 8 para ser más precisos,clientHeight
yscrollTop
ambos son compatibles con todos. Incluso es decir, 6. Esto debería ser seguro para todos los navegadores.fuente
var isAtBottom = ( logField.scrollHeight - logField.scrollTop <= logField.clientHeight + 50 );
. Esto es útil para el desplazamiento automático de un campo solo si ya está en la parte inferior (para que el usuario pueda examinar manualmente una parte específica de un registro en tiempo real sin perder su lugar, etc.).200.181819304947
y200
). Agregué unaMath.floor()
para ayudar a lidiar con eso, pero no sé qué tan confiable será.Math.abs(element.scrollHeight - element.scrollTop - element.clientHeight) <= 3.0
(reemplace 3.0 con la tolerancia de píxeles que considere apropiada para sus circunstancias). Este es el camino a seguir porque (A)clientHeight
,scrollTop
yclientHeight
están todos redondeados, lo que podría conducir a un error de 3 píxeles si todos se alinean, (B) 3 píxeles apenas son visibles para el usuario, por lo que el usuario puede pensar que algo está mal en su sitio cuando "piensan" están en la parte inferior de la página, cuando en realidad no lo están, y (C) ciertos dispositivos (especialmente los que no tienen mouse) pueden tener un comportamiento extraño al desplazarse.Para aquellos que usan la solución de Nick y reciben alertas repetidas / eventos disparados, puede agregar una línea de código sobre el ejemplo de alerta:
Esto significa que el código solo se activará la primera vez que se encuentre a menos de 100 px de la parte inferior del documento. No se repetirá si se desplaza hacia arriba y luego hacia abajo, lo que puede o no ser útil según para qué esté usando el código de Nick.
fuente
Además de la excelente respuesta aceptada de Nick Craver, puede acelerar el evento de desplazamiento para que no se active con tanta frecuencia, lo que aumenta el rendimiento del navegador :
fuente
La respuesta de Nick Craver debe modificarse ligeramente para que funcione en iOS 6 Safari Mobile y debe ser:
Cambiando .height (ventana) $ () a window.innerHeight se debe hacer porque cuando se oculta la barra de dirección de un 60 píxeles adicionales se añaden a la altura de la ventana, pero utilizando
$(window).height()
no no reflejar este cambio, durante el usowindow.innerHeight
lo hace.Nota : La
window.innerHeight
propiedad también incluye la altura de la barra de desplazamiento horizontal (si se representa), a diferencia de$(window).height()
lo que no incluirá la altura de la barra de desplazamiento horizontal. Esto no es un problema en Mobile Safari, pero podría causar un comportamiento inesperado en otros navegadores o versiones futuras de Mobile Safari. Cambiando==
a>=
podría solucionar esto para los casos de uso más comunes.Lea más sobre la
window.innerHeight
propiedad aquífuente
Aquí hay un enfoque bastante simple
const didScrollToBottom = elm.scrollTop + elm.clientHeight == elm.scrollHeight
Ejemplo
¿Dónde
elm
se recupera un elemento de iedocument.getElementById
?fuente
Aquí hay un fragmento de código que lo ayudará a depurar su código, probé las respuestas anteriores y descubrí que tienen errores. He probado lo siguiente en Chrome, IE, Firefox, IPad (Safari). No tengo otros instalados para probar ...
Puede haber una solución más simple, pero me detuve en el punto en que FUNCIONÓ
Si todavía tiene problemas con algún navegador no autorizado, aquí hay algunos códigos para ayudarlo a depurar:
Espero que esto ahorre algo de tiempo a alguien.
fuente
var docElement = document.documentElement; var winElement = window
winElement.pageYOffset
usted también puede usarwinElement.scrollY
.Por favor revisa esta respuesta
Puede hacer
footerHeight - document.body.offsetHeight
para ver si está cerca del pie de página o llegó al pie de páginafuente
Calcula la barra de desplazamiento de distancia a la parte inferior del elemento. Igual 0, si la barra de desplazamiento ha llegado al fondo.
fuente
Estos son mis dos centavos:
fuente
$(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight
=>$(this).scrollTop() + $(this).outerHeight(true) >= $(this)[0].scrollHeight
JS puro con navegador cruzado y eliminación de rebotes ( rendimiento bastante bueno )
Demostración: http://jsbin.com/geherovena/edit?js,output
PS:
Debouncer
,getScrollXY
,getDocHeight
no está escrito por míSolo muestro cómo funciona, y cómo lo haré
fuente
Mi solución en plain js:
fuente
Pruebe esto para la condición de coincidencia si se desplaza hasta el extremo inferior
fuente
Nick responde que está bien, pero tendrá funciones que se repiten mientras se desplaza o no funcionará si el usuario tiene la ventana ampliada. Se me ocurrió una solución fácil solo matemática alrededor de la primera altura y funciona tal como se supone.
fuente
Puedes probar el siguiente código,
fuente
Esto proporciona resultados precisos cuando se verifica un elemento desplazable (es decir, no
window
):offsetHeight
debe proporcionar la altura visible real de un elemento (incluido el relleno, el margen y las barras de desplazamiento), yscrollHeight
es la altura completa de un elemento, incluidas las áreas invisibles (desbordadas).jQuery
's.outerHeight()
debería dar un resultado similar al de JS.offsetHeight
: la documentación en MDN paraoffsetHeight
no está clara acerca de su compatibilidad entre navegadores. Para cubrir más opciones, esto es más completo:fuente
Math.floor(element.scrollTop) === element.scrollHeight - element.offsetHeight
en caso de que el scrollTop sea un decimal sin el que no funcionaráMath.floor()
En lugar de escuchar el evento de desplazamiento, el uso del Intersection Observer es económico para verificar si el último elemento era visible en la ventana gráfica (eso significa que el usuario se desplazó hacia abajo). También es compatible con IE7 con el polyfill .
fuente
.observe(...)
oyente de un evento como cuando el usuario se desplaza / toca su contenedor de desplazamiento para que no se active de inmediato.Todas estas soluciones no me funcionan en Firefox y Chrome, por lo que utilizo funciones personalizadas de Miles O'Keefe y meder omuraliev de esta manera:
fuente
Aquí están mis dos centavos ya que la respuesta aceptada no funcionó para mí.
fuente
Déjame mostrarte acercamiento sin JQuery. Función JS simple:
Breve ejemplo de cómo usarlo:
fuente
Usé @ddanone answear y agregué la llamada Ajax.
}
fuente
Para detener la alerta repetida de la respuesta de Nick
fuente
Google Chrome da la altura completa de la página si llamas
$(window).height()
En su lugar, use
window.innerHeight
para recuperar la altura de su ventana. La verificación necesaria debe ser:fuente
Aparentemente, lo que funcionó para mí fue 'cuerpo' y no 'ventana' como esta:
para compatibilidad con navegadores cruzados use:
y luego en lugar de $ (document) .height () llama a la función getheight ()
para uso cerca del fondo:
fuente