jquery - garder la fenêtre de modification de la position de défilement tout en ajoutant des éléments à une liste?
J'ai une page qui affiche les messages et je veux travailler comme Facebook, mais sans le lazy loader. Les Messages sont affichés dans l'ordre chronologique, le plus récent en dernier.
Mon message liste est initialement peuplée x nombre de messages les plus récents, et la fenêtre défile vers le bas. Lorsque l'utilisateur commence à lire le fil, ils lisent de bas en haut. Si ils arrivent à le haut, ils peuvent charger plus de messages... je leur fais de cliquer sur un bouton... facebook a un lazy loader. Les nouveaux messages sont ajoutés à la liste.
Problème: Comme les nouveaux messages sont ajoutés, les messages existants sont poussés vers le bas, causant la perte de leur "affichage" de place. Comment puis-je garder la position de la vue que j'ai ajouter les nouveaux messages? Pour un exemple, ouvrez un long fil de message dans facebook, faites défiler vers le haut à l'origine de nouveaux messages seront ajouté... votre endroit de vue ne change pas même si la fonction de défilement n'.
Vous devez vous connecter pour publier un commentaire.
Stocker une référence pour le premier message avant d'ajouter de nouveaux messages, et après vous ajouter, définir le faites défiler jusqu'à l'offset de ce message:
Démo: http://jsfiddle.net/GRnQY/
Modifier: j'ai remarqué que tu voulais avec un bouton. Vous pourriez avoir à faire un peu plus de maths:
Démo: http://jsfiddle.net/GRnQY/5/
$(selector).scrollTop(firstMsg.offset().top-curOffset);
sur l'ajaxsuccess
attribut pour le défilement fonctionne correctementfirstMsg.offset()
peut insetad utiliser l'élément cible de l'événement click, faisant de cet extrait de code plus portable:var curOffset = $(this).offset().top - $(document).scrollTop(); /* do stuff above the button */ $(document).scrollTop($(this).offset().top-curOffset);
c.f. <jsfiddle.net/bwz8uLvt/1> (ci-dessus démo, mais avec un bouton à l'arbitraire de la place dans la page)Pas besoin de jQuery ici, il suffit de vérifier les changements dans les éléments scrollHeight et ajuster la scrollTop en conséquence, c'est à dire:
Démo
http://jsfiddle.net/fkqqv28e/
jQuery
Pour accéder à la maternelle nœud DOM à partir d'un jQuery collecte, à l'utilisation de la matrice de l'accès, c'est à dire:
Certaines personnes de venir ici simplement pour ajouter du contenu sans l'accent actuellement mis à sauter partout. La modification de Jeff B de la démo ci-dessus pour utiliser le clic cible de l'événement qui rend cette idiome plus portable:
c.f. http://jsfiddle.net/bwz8uLvt/1/ (variante de Jeff B de la démo ci-dessus mais avec le bouton [ajouter plus] à un point arbitraire dans la page).
Voici un truc tout simple qui a fonctionné pour moi:
Vous pouvez également maintenir la position de défilement en fonction du décalage vers le bas de la page/élément.
J'ai juste couru à travers une variation de la présente. je l'ai détaché un grand nombre d'éléments, traitées, puis attaché de nouveau. ce n'est pas effectuée de manière synchrone dans google Chrome, donc je ne pouvais pas mettre $el.scrollTop(oldval) de façon fiable. J'ai trouvé cette solution a fonctionné pour moi.