Vérifier si un utilisateur a un défilement vers le bas
Je suis en train de faire un système de pagination (comme Facebook) où le chargement du contenu lorsque l'utilisateur fait défiler vers le bas. J'imagine que la meilleure façon de le faire est de trouver lorsque l'utilisateur est en bas de la page et exécuter une requête ajax pour charger plus de postes.
Le seul problème est que je ne sais pas comment faire pour vérifier si l'utilisateur a défilé vers le bas de la page avec jQuery. Des idées?
J'ai besoin de trouver un moyen de vérifier si l'utilisateur a défilé vers le bas de la page avec jQuery.
- C'est drôle, j'essaie de comprendre la fonction qui est appelée quand je scroll vers le bas, de sorte que je peux bloquer ce exaspérant "fonctionnalité".
- Pour un React.js la solution, ce lien peut vous aider: stackoverflow.com/a/53158893/4265546
Vous devez vous connecter pour publier un commentaire.
Utiliser le
.de défilement()
événement surwindow
, comme ceci:Vous pouvez le tester ici, cela prend du haut de défilement de la fenêtre, donc combien il défile vers le bas, ajoute la hauteur de la fenêtre visible et vérifie si c'est égal à la hauteur de l'ensemble du contenu (
document
). Si vous voulais au lieu de vérifier si l'utilisateur est près de le fond, ça ressemble à quelque chose comme ceci:Vous pouvez tester cette version ici, il suffit de régler que
100
à ce pixel à partir de la base, vous voulez déclencher sur.console.log()
au lieu de l'alerte il y a parfois répète la commande.bottom
classe ajoutée lorsqu'il atteint le fond du récipient. Serais-je en mesure de modifier ce code en quelque sorte pour cette fonction? Ma question est de savoir ici si vous souhaitez prendre un coup d'oeil: stackoverflow.com/questions/22571739/...$(window).scrollTop()
comme une variable, si c'est moins que la dernière fois, vous êtes de défilement..position().top
au lieu des 100 ci-dessus.$(window).scrollTop()
n'est pas toujours à la valeur entière lorsqu'il est testé sous Chrome. Pour corriger cela, vous pouvez utiliser:Math.floor($(window).scrollTop() + $(window).height()) == $(document).height()
Nick Craver réponse fonctionne très bien, de rechange, la question que la valeur de
$(document).height()
varie selon le navigateur.Pour le faire fonctionner sur tous les navigateurs, utilisez cette fonction à partir de James Padolsey:
en place de
$(document).height()
, de sorte que le code final est:min
au lieu demax
, surtout si il y a une marge de toute façon, pour éviter accidentellement en empêchant l'utilisateur de défilement à ce que vous pensez est le bas de la page.Je ne suis pas exactement sûr de savoir pourquoi cela n'a pas été posté, mais comme par la documentation à partir du MDN, la façon la plus simple est d'utiliser javascript natif propriétés:
Retourne vrai lorsque vous êtes au bas de n'importe quel élément déroulant. Donc tout simplement à l'aide de javascript:
scrollHeight
bénéficient d'un large soutien dans les navigateurs, à partir de ie 8 pour être plus précis, tandis queclientHeight
etscrollTop
sont tous deux pris en charge par tout le monde. Même ie 6. Ce doit être du navigateur croix de sécurité.var isAtBottom = ( logField.scrollHeight - logField.scrollTop <= logField.clientHeight + 50 );
. Ceci est utile pour les auto-défilement d'un champ uniquement si déjà à la base (et donc l'utilisateur peut examiner manuellement une partie spécifique de un temps réel journal sans perdre leur place, etc).200.181819304947
et200
). J'ai ajouté unMath.floor()
pour vous aider à composer avec cela, mais je ne sais pas quelle est la fiabilité de ce sera.Math.abs(element.scrollHeight - element.scrollTop - element.clientHeight) <= 3.0
(remplacer 3.0 avec quel pixel de la tolérance que vous pensez est approprié pour votre situation). C'est la voie à suivre parce que (Un)clientHeight
,scrollTop
, etclientHeight
sont arrondis, ce qui pourrait potentiellement conduire à un 3px erreur si tous les aligner, (B) 3 pixels est à peine visible à l'utilisateur afin que l'utilisateur puisse penser que quelque chose est incorrect avec votre site lorsqu'ils "pensent" qu'ils sont au bas de la page, alors qu'en fait ils ne le sont pas, et (C) certains dispositifs (notamment ... souris?) peut avoir un comportement étrange lors du défilement.Pour les personnes à l'aide de Nick solution et obtenir des alertes répétées /événements de la cuisson, vous pouvez ajouter une ligne de code au-dessus de l'alerte exemple:
Cela signifie que le code se déclenche uniquement la première fois que vous êtes à l'intérieur de 100px de bas du document. Il ne se répétera pas si vous défiler l'écran vers le haut et ensuite vers le bas, qui peut ou peut ne pas être utile en fonction de ce que vous êtes à l'aide du Pseudo code pour.
$(window).unbind('scroll');
ligne problème sera résolu.Suite à l'excellent accepté la réponse de Nick Craver, vous pouvez limiter le défilement de l'événement de sorte qu'il n'est pas déclenché si souvent ainsi augmenter les performances du navigateur:
Nick Craver la réponse doit être légèrement modifié pour qu'il fonctionne sur iOS 6 Safari Mobile et doit être:
Changer $(window).hauteur() à fenêtre.innerHeight doit être fait, parce que quand la barre d'adresse est cachée supplémentaires 60px sont ajoutés à la fenêtre de la hauteur, mais à l'aide de
$(window).height()
ne pas tenir compte de ce changement, tout en utilisantwindow.innerHeight
n'.Note: Le
window.innerHeight
propriété comprend également la barre de défilement horizontale de la hauteur (si elle est rendue), à la différence de$(window).height()
qui ne comprendront pas la barre de défilement horizontale de la hauteur. Ce n'est pas un problème dans le navigateur Safari Mobile, mais peut entraîner un comportement inattendu dans d'autres navigateurs ou les futures versions de Safari Mobile. Changer==
à>=
pourrait corriger cela pour la plupart des cas d'utilisation courants.Lire plus sur le
window.innerHeight
propriété iciIci est assez simple d'approche:
Voici un morceau de code qui va vous aider à déboguer votre code, j'ai testé les réponses ci-dessus et les a trouvés buggy. J'ai test les suivants sur Chrome, IE, Firefox, IPad(Safari). Je n'ai pas d'autres installée pour tester...
Il y a peut être une solution plus simple, mais j'ai arrêté au moment où IL a TRAVAILLÉ
Si vous rencontrez toujours des problèmes avec certains voyous navigateur, voici un peu de code pour vous aider à déboguer:
J'espère que cela va sauver quelqu'un certain temps.
var docElement = document.documentElement; var winElement = window
winElement.pageYOffset
vous pouvez également utiliserwinElement.scrollY
.C'est mes deux cents:
Il calcule la distance de la barre de défilement en bas de l'élément.
Égale à 0, si la barre de défilement a atteint le fond.
Veuillez vérifier cette réponse
Vous pouvez faire
footerHeight - document.body.offsetHeight
pour voir si vous êtes près du pied de page ou pied de pagePur JS avec de la croix-navigateur et anti-rebond (Pretty good performance)
Démo : http://jsbin.com/geherovena/edit?js,sortie
PS:
Debouncer
,getScrollXY
,getDocHeight
pas écrit par moiJe viens de montrer la façon dont son travail, Et comment je vais faire
Nick réponses de son bien, mais vous allez avoir des fonctions qui se répète en soi pendant le défilement ou ne fonctionnera pas si l'utilisateur a la fenêtre de zoom. Je suis venu avec une solution facile que des maths.la hauteur et il fonctionne exactement comme l'avait supposé.
Vous pouvez essayer le code suivant,
Essayez ceci pour correspondre à condition de défilement vers le bas fin
Ma solution dans la plaine js:
JS:
CSS:
HTML:
Toutes ces solutions ne fonctionne pas pour moi sur Firefox et Chrome, j'ai donc utiliser des fonctions personnalisées à partir de Miles O'Keefe et meder omuraliev comme ceci:
Cela donne des résultats précis, lors de la vérification sur un défilement élément (c'est à dire pas
window
):offsetHeight
devrait donner la réel visible hauteur d'un élément (y compris les padding, margin, et barres de défilement), etscrollHeight
est le ensemble hauteur d'un élément y compris les invisibles (débordé) des zones.jQuery
's.outerHeight()
devrait donner des résultats similaires JS du.offsetHeight
--la documentation en MDN pour
offsetHeight
n'est pas claire sur sa croix-prise en charge du navigateur. Pour couvrir plus d'options, ce qui est le plus complet:Laissez-moi vous montrer approche sans JQuery. Simple JS fonction:
Petit exemple de comment l'utiliser:
J'ai utilisé @ddanone answear, et ajouté de l'appel Ajax.
}
Pour arrêter répétée d'alerte de Nick réponse
Voici mes deux cents que l'on a accepté la réponse n'a pas fonctionné pour moi.