Я написал эту функцию, используя идеи Хусейна и Ника, но я хотел, чтобы она использовала обещания для обратного вызова.Я также хотел, чтобы область бесконечной прокрутки находилась на фиксированном элементе div, а не только в окне, если элемент div отправлялся в объект параметров.Пример этого есть во второй ссылке ниже.Я предлагаю использовать библиотеку обещаний, например Q , если вы хотите поддерживать старые браузеры.Метод cb может быть или не быть обещанием, и он будет работать независимо.
Он используется так:
html
<div id="feed"></div>
js
var infScroll = infiniteScroll({
cb: function () {
return doSomethingPossiblyAnAJAXPromise();
}
});
Если вы хотите, чтобы подача временно прекращалась, вы можете вернуть false в методе cb.Полезно, если вы достигли конца канала.Его можно запустить снова, вызвав метод возвращенного объекта infiniteScroll 'setShouldLoad' и передав true и пример, чтобы следовать приведенному выше коду.
infScroll.setShouldLoad(true);
Функция для бесконечной прокрутки это
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;
}
1 пример подачи с окном в качестве скроллера
2 пример подачи с подачей в качестве скроллера