бесконечные прокрутки jQuery плагин
Я пытаюсь настроить бесконечную прокрутку на сайте, который я разрабатываю с помощью Coldfusion, я новичок в javascript и jquery, поэтому у меня возникли некоторые проблемы, связанные со всем этим. Нужно ли мне иметь пагинацию на моем сайте, чтобы использовать плагин infinite-scroll, или есть способ сделать это без него?
8 ответов:
вам не нужен бесконечный плагин прокрутки для этого. Чтобы определить, когда прокрутка доходит до конца страницы, с помощью jQuery вы можете сделать
$(window).scroll(function () { if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) { //Add something at the end of the page } });
демо на JsFiddle
Я использую ответ Хусейна с запросами AJAX. Я изменил код для запуска в 300px вместо 10px, но он начал заставлять мои добавления умножаться до завершения запроса AJAX, так как вызов прокрутки срабатывает гораздо чаще в диапазоне 300px, чем в диапазоне 10px.
чтобы исправить это, я добавил триггер, который будет перевернут при успешной загрузке AJAX. Мой код выглядит примерно так:
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 } });
затем в моем ответе AJAX я установил
scrollLoad
totrue
.
Я построил поверх маленького примера Хусейна здесь, чтобы сделать виджет jQuery. Он поддерживает localStorage для временного сохранения добавленных результатов и имеет функцию паузы, чтобы остановить добавление так часто, требуя щелчка, чтобы продолжить.
дайте ему попробовать:
Если у вас есть какая-то ссылка, например, ваш нижний колонтитул, вы можете использовать этот код, скажем, у вас есть нижний колонтитул div с идентификатором #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... }; });
также, если вы хотите получить дополнительную информацию, проверьте это, как создать бесконечную прокрутку в руководстве jqueryhttp://dumpk.com/2013/06/02/how-to-create-infinite-scroll-with-ajax-on-jquery/
$(function(){ $(window).scroll(function(){ if($(document).height()<=$(window).scrollTop()+$(window).height()+100){ alert('end of page'); } }); });
кто-то попросил объяснения так вот объяснение
здесь $(документ).высота ()-->это высота всего document.In в большинстве случаев это соответствует элементу текущего документа.
$(окно).высота ()-->это высота окна (браузера) означает высоту всего, что вы видите в браузере.
$(окно).scrollTop()-->элемент.свойство scrollTop возвращает или задает количество пикселей, что содержание элемента прокручивается вверх. ScrollTop элемента-это измерение расстояния от вершины элемента до его самого верхнего видимого содержимого. Если содержимое элемента не генерирует вертикальную полосу прокрутки, то его значение scrollTop по умолчанию равно 0.
$(document).height()<=$(window).scrollTop()+$(window).height()+100
добавить $(окно).scrollTop() с $(window).height () теперь проверьте, равен ли результат вашей высоте documnet или нет. если он равен означает, что вы достигли в конце.мы добавляем 100 тоже, потому что я хочу проверить до 100 пикселей нижняя часть документа (примечание
пожалуйста, поправьте меня, если я ошибаюсь
Я написал эту функцию, используя идеи Хусейна и Ника, но я хотел, чтобы она использовала обещания для обратного вызова. Я также хотел, чтобы бесконечная область прокрутки была на фиксированном div, а не только в окне, если div отправляется в объект options. Есть пример этого в моей второй ссылке ниже. Я предлагаю использовать библиотеку обещаний, как Q если вы хотите поддерживать старые браузеры. Метод cb может быть или не быть обещанием, и он будет работать не обращающий внимания.
Он используется так:
html
<div id="feed"></div>
js
var infScroll = infiniteScroll({ cb: function () { return doSomethingPossiblyAnAJAXPromise(); } });
если вы хотите, чтобы канал временно остановился, вы можете вернуть false в методе cb. Полезно, если вы попали в конец ленты. Его можно запустить снова, вызвав метод возвращаемого объекта infiniteScroll 'setshouldoad' и передав true и example, чтобы перейти к приведенному выше коду.
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; }
Если у вас есть прокручиваемый элемент, например div с переполнением прокрутки, но нет прокручиваемого документа/страницы, вы можете воспользоваться этим способом.
$(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 */ } }); });
у меня была такая же проблема но не нашел подходящий плагин для моей потребности. поэтому я написал следующий код. этот код добавляет шаблон к элементу, получая данные с помощью ajax и разбиения на страницы. для обнаружения, когда пользователь прокручивает в нижней части div я использовал это условие:
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>