Je fais un système de pagination (un peu comme Facebook) où le contenu se charge lorsque l'utilisateur défile vers le bas. J'imagine que la meilleure façon de le faire est de trouver quand l'utilisateur est en bas de la page et d'exécuter une requête ajax pour charger plus de messages.
Le seul problème est que je ne sais pas comment vérifier si l'utilisateur a fait défiler vers le bas de la page avec jQuery. Des idées?
Je dois trouver un moyen de vérifier quand l'utilisateur a fait défiler vers le bas de la page avec jQuery.
javascript
jquery
scroll
pagination
Johnny
la source
la source
Réponses:
Utilisez l'
.scroll()
événementwindow
comme ceci:Vous pouvez le tester ici , cela prend le défilement supérieur de la fenêtre, alors combien il défile, ajoute la hauteur de la fenêtre visible et vérifie si cela est égal à la hauteur du contenu global (
document
). Si vous vouliez plutôt vérifier si l'utilisateur est près du bas, cela ressemblerait à ceci:Vous pouvez tester cette version ici , ajustez-la simplement
100
au pixel du bas sur lequel vous souhaitez déclencher.la source
console.log()
au lieu d'alerte il répète parfois la commande.La réponse de Nick Craver fonctionne très bien, évitez le problème dont la valeur
$(document).height()
varie selon le navigateur.Pour le faire fonctionner sur tous les navigateurs, utilisez cette fonction de James Padolsey :
à la place de
$(document).height()
, de sorte que le code final soit:la source
min
place demax
, surtout s'il y a quand même une marge, pour éviter d'empêcher accidentellement l'utilisateur de défiler jusqu'à ce que vous pensez être le bas de la page.Je ne sais pas exactement pourquoi cela n'a pas encore été publié, mais selon la documentation de MDN , le moyen le plus simple consiste à utiliser les propriétés natives javascript:
Renvoie true lorsque vous êtes au bas d'un élément déroulant. Il suffit donc d'utiliser javascript:
scrollHeight
ont un large support dans les navigateurs, de ie 8 pour être plus précis, tandis queclientHeight
etscrollTop
sont tous deux pris en charge par tout le monde. Même c.-à-d. 6. Cela devrait être sûr pour tous les navigateurs.la source
var isAtBottom = ( logField.scrollHeight - logField.scrollTop <= logField.clientHeight + 50 );
. Ceci est utile pour faire défiler automatiquement un champ uniquement s'il est déjà en bas (afin que l'utilisateur puisse examiner manuellement une partie spécifique d'un journal en temps réel sans perdre sa place, etc.).200.181819304947
Et200
). J'ai ajouté unMath.floor()
pour aider à gérer cela, mais je ne sais pas à quel point ce sera fiable.Math.abs(element.scrollHeight - element.scrollTop - element.clientHeight) <= 3.0
(remplacez 3.0 par la tolérance de pixels que vous jugez appropriée à votre situation). C'est la voie à suivre car (A)clientHeight
,scrollTop
etclientHeight
sont tous arrondis, ce qui pourrait potentiellement conduire à une erreur de 3 pixels si tous s'alignent, (B) 3 pixels sont à peine visibles pour l'utilisateur, de sorte que l'utilisateur peut penser que quelque chose ne va pas avec votre site quand ils "pensent" qu'ils sont en bas de la page alors qu'en fait ils ne le sont pas, et (C) certains appareils (en particulier ceux sans souris) peuvent avoir un comportement étrange lors du défilement.Pour ceux qui utilisent la solution de Nick et reçoivent des alertes / événements répétés, vous pouvez ajouter une ligne de code au-dessus de l'exemple d'alerte:
Cela signifie que le code ne se déclenchera que la première fois que vous vous trouverez à moins de 100 px du bas du document. Cela ne se répétera pas si vous faites défiler vers le haut puis vers le bas, ce qui peut être utile ou non selon l'utilisation que vous faites du code de Nick.
la source
Suite à l'excellente réponse acceptée de Nick Craver, vous pouvez limiter l'événement de défilement afin qu'il ne soit pas déclenché si fréquemment, augmentant ainsi les performances du navigateur :
la source
La réponse de Nick Craver doit être légèrement modifiée pour fonctionner sur iOS 6 Safari Mobile et devrait être:
La modification de $ (window) .height () en window.innerHeight doit être effectuée car lorsque la barre d'adresse est masquée, 60 pixels supplémentaires sont ajoutés à la hauteur de la fenêtre, mais l'utilisation
$(window).height()
ne reflète pas ce changement, tandis que l'utilisation de lewindow.innerHeight
fait.Remarque : La
window.innerHeight
propriété inclut également la hauteur de la barre de défilement horizontale (si elle est rendue), contrairement à$(window).height()
ce qui n'inclura pas la hauteur de la barre de défilement horizontale. Ce n'est pas un problème dans Mobile Safari, mais cela pourrait provoquer un comportement inattendu dans d'autres navigateurs ou dans les futures versions de Mobile Safari. Changer==
pour>=
pourrait résoudre ce problème dans la plupart des cas d'utilisation courants.En savoir plus sur la
window.innerHeight
propriété icila source
Voici une approche assez simple
const didScrollToBottom = elm.scrollTop + elm.clientHeight == elm.scrollHeight
Exemple
Où
elm
est un élément extrait de iedocument.getElementById
.la source
Voici un morceau de code qui vous aidera à déboguer votre code, j'ai testé les réponses ci-dessus et les ai trouvées boguées. J'ai testé les éléments suivants sur Chrome, IE, Firefox, IPad (Safari). Je n'en ai pas d'autres installés pour tester ...
Il peut y avoir une solution plus simple, mais je me suis arrêté au moment où ça a marché
Si vous rencontrez toujours des problèmes avec un navigateur escroc, voici un code pour vous aider à déboguer:
J'espère que cela fera gagner du temps à quelqu'un.
la source
var docElement = document.documentElement; var winElement = window
winElement.pageYOffset
vous pouvez également utiliserwinElement.scrollY
.Veuillez cocher cette réponse
Vous pouvez faire
footerHeight - document.body.offsetHeight
pour voir si vous êtes près du pied de page ou atteint le pied de pagela source
Il calcule la barre de défilement de la distance jusqu'au bas de l'élément. Égal à 0, si la barre de défilement a atteint le bas.
la source
Voici mes deux cents:
la source
$(this).scrollTop() + $(this).height() == $(this)[0].scrollHeight
=>$(this).scrollTop() + $(this).outerHeight(true) >= $(this)[0].scrollHeight
Pure JS avec multi-navigateur et anti - rebond (assez bonnes performances )
Démo: http://jsbin.com/geherovena/edit?js,output
PS:
Debouncer
,getScrollXY
,getDocHeight
pas écrit par moiJe montre juste comment ça marche, et comment je vais faire
la source
Ma solution en clair js:
la source
Essayez ceci pour une condition de correspondance si faites défiler vers le bas
la source
Nick répond bien, mais vous aurez des fonctions qui se répètent pendant le défilement ou ne fonctionneront pas du tout si l'utilisateur a zoomé sur la fenêtre. J'ai trouvé une solution simple juste mathématique autour de la première hauteur et cela fonctionne comme prévu.
la source
Vous pouvez essayer le code suivant,
la source
Cela donne des résultats précis, lors de la vérification d'un élément déroulant (c'est-à-dire pas
window
):offsetHeight
devrait donner le visible réelle hauteur d'un élément (y compris le rembourrage, la marge, et des barres de défilement), etscrollHeight
est la totalité de la hauteur d'un élément (y compris les zones invisibles débordé).jQuery
« s.outerHeight()
devraient donner des résultats similaires à de JS.offsetHeight
- la documentation pour MDNoffsetHeight
ne définit pas clairement son soutien multi-navigateur. Pour couvrir plus d'options, c'est plus complet:la source
Math.floor(element.scrollTop) === element.scrollHeight - element.offsetHeight
au cas où le scrollTop est une décimale sans laquelle il ne fonctionnera pasMath.floor()
Au lieu d'écouter l'événement scroll, utiliser Intersection Observer est celui peu coûteux pour vérifier si le dernier élément était visible dans la fenêtre (c'est-à-dire que l'utilisateur a été fait défiler vers le bas). Il a également pris en charge IE7 avec le polyfill .
la source
.observe(...)
sur un écouteur d'événement comme lorsque l'utilisateur survole / touche votre conteneur de défilement afin qu'il ne se déclenche pas immédiatement.Toutes ces solutions ne fonctionnent pas pour moi sur Firefox et Chrome, donc j'utilise des fonctions personnalisées de Miles O'Keefe et meder omuraliev comme ceci:
la source
Voici mes deux cents car la réponse acceptée n'a pas fonctionné pour moi.
la source
Permettez-moi de montrer l'approche sans JQuery. Fonction JS simple:
Petit exemple d'utilisation:
la source
J'ai utilisé @ddanone answerear et ajouté un appel Ajax.
}
la source
Pour arrêter l'alerte répétée de la réponse de Nick
la source
Google Chrome donne toute la hauteur de la page si vous appelez
$(window).height()
Au lieu de cela, utilisez
window.innerHeight
pour récupérer la hauteur de votre fenêtre. La vérification nécessaire doit être:la source
Apparemment, ce qui a fonctionné pour moi était le «corps» et non la «fenêtre» comme ceci:
pour une compatibilité entre navigateurs:
puis au lieu de $ (document) .height () appelez la fonction getheight ()
pour une utilisation proche du fond:
la source