Ich versuche unendliche Schriftrollen auf einer Site einzurichten, die ich mit Coldfusion entwickle. Ich bin neu in Javascript und Jquery, also habe ich einige Probleme, die meinen Kopf mit all dem zu tun haben. Muss ich auf meiner Website eine Paginierung haben, um das Infinite-Scroll-Plugin verwenden zu können, oder gibt es eine Möglichkeit, dies ohne zu tun?
Sie benötigen dazu kein unendliches Scroll-Plug-In. Mit jQuery können Sie feststellen, wann der Bildlauf das Seitenende erreicht
$(window).scroll(function () {
if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) {
//Add something at the end of the page
}
});
Demo auf JsFiddle
Ich verwende Husseins Antwort mit AJAX -Anfragen. Ich habe den Code so geändert, dass er bei 300px anstelle von 10px ausgelöst wird, aber er hat dazu geführt, dass sich meine Anhänge vervielfachten, bevor die Anforderung AJAX beendet wurde, da der Scroll-Aufruf in einem 300px-Bereich viel häufiger ausgelöst wird als in einem 10px-Bereich.
Um dies zu beheben, habe ich einen Auslöser hinzugefügt, der beim erfolgreichen Laden von AJAX umgedreht wurde. Mein Code sieht eher so aus:
var scrollLoad = true;
$(window).scroll(function () {
if (scrollLoad && $(window).scrollTop() >= $(document).height() - $(window).height() - 300) {
scrollLoad = false;
//Add something at the end of the page
}
});
in meiner Antwort AJAX setze ich scrollLoad
auf true
.
Ich habe hier auf Husseins kleines Beispiel aufgebaut, um ein jQuery-Widget zu erstellen. Es unterstützt localStorage, um angehängte Ergebnisse vorübergehend zu speichern, und verfügt über eine Anhaltefunktion, um das Anhängen von Zeit zu Zeit anzuhalten, sodass ein Klick erforderlich ist, um fortzufahren.
Versuche es:
Wenn Sie einen Verweis haben, können Sie diesen Code wie Ihre Fußzeile verwenden. Nehmen wir an, Sie haben eine Fußzeile div mit der ID #footer:
function element_in_scroll(elem)
{
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
$(document).scroll(function(e){
if (element_in_scroll("#footer")) {
//Here you must do what you need to achieve the infinite scroll effect...
};
});
Wenn Sie weitere Informationen benötigen, lesen Sie hier, wie Sie einen unendlichen Bildlauf für das Jquery-Handbuch http://dumpk.com/2013/06/02/how-to-create-infinite-scroll-with-ajax-on-jquery) erstellen /
$(function(){
$(window).scroll(function(){
if($(document).height()<=$(window).scrollTop()+$(window).height()+100){
alert('end of page');
}
});
});
Jemand bat um Erklärung, also hier ist die Erklärung
hier ist $ (document) .height () -> die Höhe des gesamten Dokuments. In den meisten Fällen entspricht dies dem Element des aktuellen Dokuments.
$ (window) .height () -> ist die Höhe des Fensters (Browser), die die Höhe von dem darstellt, was Sie im Browser sehen.
$ (window) .scrollTop () -> Die Eigenschaft Element.scrollTop ermittelt oder legt die Anzahl der Pixel fest, um die der Inhalt eines Elements nach oben gerollt wird. Das scrollTop eines Elements ist ein Maß für die Entfernung des oberen Teils eines Elements zum obersten sichtbaren Inhalt. Wenn ein Elementinhalt keine vertikale Bildlaufleiste generiert, ist der Wert für scrollTop standardmäßig auf 0 gesetzt.
$(document).height()<=$(window).scrollTop()+$(window).height()+100
fügen Sie $ (window) .scrollTop () mit $ (window) .height () hinzu. Prüfen Sie nun, ob das Ergebnis Ihrer Documnet-Höhe entspricht oder nicht. Wenn es gleich ist, bedeutet dies, dass Sie am Ende erreicht sind. Wir addieren ebenfalls 100, da ich vor den 100 Pixeln vom unteren Rand des Dokuments prüfen möchte (Anmerkung <= in Bedingung).
bitte korrigieren Sie mich, wenn ich falsch liege
Ich habe diese Funktion mit Husseins und Nicks Ideen geschrieben, wollte aber Versprechen für den Rückruf verwenden. Ich wollte auch, dass sich der unendliche Bildlaufbereich auf einem festen div befindet und nicht nur das Fenster, wenn das div in das Optionsobjekt gesendet wird. Es gibt ein Beispiel dafür in meinem zweiten Link unten. Ich schlage vor, eine Versprechenbibliothek wie Q zu verwenden, wenn Sie ältere Browser unterstützen möchten. Die cb-Methode kann ein Versprechen sein oder nicht, und sie funktioniert trotzdem.
Es wird wie folgt verwendet:
html
<div id="feed"></div>
js
var infScroll = infiniteScroll({
cb: function () {
return doSomethingPossiblyAnAJAXPromise();
}
});
Wenn der Feed vorübergehend angehalten werden soll, können Sie in der cb-Methode false zurückgeben. Nützlich, wenn Sie das Ende des Feeds erreicht haben. Es kann erneut gestartet werden, indem die zurückgegebene Objektmethode 'setShouldLoad' von infiniteScroll aufgerufen wird und true und ein Beispiel übergeben werden, um den obigen Code zu verwenden.
infScroll.setShouldLoad(true);
Die Funktion für das unendliche Scrollen ist dies
function infiniteScroll (options) {
// these options can be overwritten by the sent in options
var defaultOptions = {
binder: $(window), // parent scrollable element
loadSpot: 300, //
feedContainer: $("#feed"), // container
cb: function () { },
}
options = $.extend(defaultOptions, options);
options.shouldLoad = true;
var returnedOptions = {
setShouldLoad: function (bool) { options.shouldLoad = bool; if(bool) { scrollHandler(); } },
};
function scrollHandler () {
var scrollTop = options.binder.scrollTop();
var height = options.binder[0].innerHeight || options.binder.height();
if (options.shouldLoad && scrollTop >= (options.binder[0].scrollHeight || $(document).height()) - height - options.loadSpot) {
options.shouldLoad = false;
if(typeof options.cb === "function") {
new Promise(function (resolve) {resolve();}).then(function() { return options.cb(); }).then(function (isNotFinished) {
if(typeof isNotFinished === "boolean") {
options.shouldLoad = isNotFinished;
}
});
}
}
}
options.binder.scroll(scrollHandler);
scrollHandler();
return returnedOptions;
}
Wenn Sie über ein scrollbares Element verfügen, z. B. ein div mit Scrollüberlauf, aber kein scrollbares Dokument/Seite, können Sie dies tun.
$(function () {
var s = $(".your-scrollable-element");
var list = $("#your-table-list");
/* On element scroll */
s.scroll(function () {
/* The scroll top plus element height equals to table height */
if ((s.scrollTop() + s.height()) == list.height()) {
/* you code */
}
});
});
Ich hatte das gleiche Problem, fand aber kein passendes Plugin für meine Bedürfnisse. Also habe ich folgenden Code geschrieben. Dieser Code hängt die Schablone an das Element an, indem Daten mit Ajax und Paginierung abgerufen werden.
var t = $("#infiniteContent").offset().top;
var h = $("#infiniteContent").height();
var ws = $(window).scrollTop();
var dh = $(document).height();
var wh = $(window).height();
if (dh - (wh + ws) < dh - (h + t)) {
//now you are at bottom of #infiniteContent element
}
$(document).ready(function(){
$.getJSON("https://jsonplaceholder.typicode.com/comments", { _page: 1, _limit:3 }, function (jsonre) {
appendTemplate(jsonre,1);
});
});
function appendTemplate(jsonre, pageNumber){
//instead of this code you can use a templating plugin like "Mustache"
for(var i =0; i<jsonre.length; i++){
$("#infiniteContent").append("<div class='item'><h2>"+jsonre[i].name+"</h2><p>"+jsonre[i].body+"</p></div>");
}
if (jsonre.length) {
$("#infiniteContent").attr("data-page", parseInt(pageNumber)+1);
$(window).on("scroll", initScroll);
//scroll event will not trigger if window size is greater than or equal to document size
var dh = $(document).height() , wh = $(window).height();
if(wh>=dh){
initScroll();
}
}
else {
$("#infiniteContent").attr("data-page", "");
}
}
function initScroll() {
var t = $("#infiniteContent").offset().top;
var h = $("#infiniteContent").height();
var ws = $(window).scrollTop();
var dh = $(document).height();
var wh = $(window).height();
if (dh - (wh + ws) < dh - (h + t)) {
$(window).off('scroll');
var p = $("#infiniteContent").attr("data-page");
if (p) {
$.getJSON("https://jsonplaceholder.typicode.com/comments", { _page: p, _limit:3 }, function (jsonre) {
appendTemplate(jsonre, p);
});
}
}
}
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<div id="infiniteContent"></div>