jquery плъгин за безкрайно превъртане

Опитвам се да настроя безкрайно превъртане на сайт, който разработвам с Coldfusion, нов съм в javascript и jquery, така че имам някои проблеми, докато се занимавам с всичко това. Трябва ли да имам страниране на моя сайт, за да използвам плъгина за безкрайно превъртане, или има начин да го направя без него?


person rajh2504    schedule 20.02.2011    source източник
comment
@francis какво имаш предвид под скъпо. Не е нужно да обвързвате всичко със свитъка. Зависи какво искате да правите. Това е общ пример. превъртането се поддържа между браузъри.   -  person Hussein    schedule 27.02.2012
comment
Опитайте това страхотно безкрайно превъртане - github.com/yairEO/infinite   -  person vsync    schedule 14.09.2015
comment
@vsync не те обвинява, но изглежда малко бъги, когато превърташ, за мен, когато превъртам, скача от 20 на 40? Moz Firefox за сведение   -  person Shaun Moore    schedule 16.09.2020
comment
@ShaunMoore - зависи от операционната система и дали сте активирали плавно превъртане. Проектирах го преди 6 години, за да се използва за проекти със скрита лента за превъртане и тогава поведението има повече смисъл   -  person vsync    schedule 16.09.2020


Отговори (7)


За това не се нуждаете от плъгин за безкрайно превъртане. За да откриете кога превъртането достига края на страницата, с jQuery можете да направите това

$(window).scroll(function () { 
   if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) {
      //Add something at the end of the page
   }
});

Демо на JsFiddle

person Hussein    schedule 20.02.2011
comment
Защо точно константата -10? Размерът на стрелките в лентата за превъртане ли е? - person BrunoSalvino; 29.04.2011
comment
@bruno Scroll се случва, когато достигне 10px преди края на страницата и не е необходимо самия край на страницата. Не е необходимо да го имате, но дава по-голям контрол за определяне на коя точка страницата трябва да се превърти. - person Hussein; 29.04.2011
comment
Възможно ли е да го приемете към фиксиран DIV вместо страница? - person Mark Vital; 21.10.2012
comment
@Hussein благодаря, това е просто и хубаво, мога просто да извикам своя ajax на горния код - person kobe; 13.03.2013
comment
Страхотни неща! Трябваше да направя малка модификация за задействания на по-голяма площ за превъртане. По принцип зададох тригер за предотвратяване на непрекъснати добавяния, докато последното добавяне не беше успешно. Отговорете тук: stackoverflow.com/a/18090897/337903 - person Nick; 07.08.2013
comment
Не са ли $(document).height() и $(window).height() едно и също? - person Dmitri Zaitsev; 17.04.2014
comment
Как се справя това със зареждането, например ако съм използвал това за зареждане на изображения? - person Shaun Moore; 16.09.2020

Използвам отговора на Хюсеин с 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 на true.

person Nick    schedule 06.08.2013
comment
Също така трябваше да добавя код за страниране към моя, за да завърша ефекта. Не е трудно, но трябва да се отбележи. - person thekingoftruth; 26.09.2013
comment
Използвах този метод. Работи добре. Благодаря. Но в края на страницата се появява трептене. Това е последният запис на БД. Но когато потребителят се опита да зареди повече, страницата трепти. Как да се преодолее това? - person Prageeth Liyanage; 21.07.2018

Създадох върху малкия пример на Хюсеин тук, за да направя джаджа jQuery. Той поддържа localStorage за временно запазване на добавени резултати и има функция за пауза, за да спре добавянето от време на време, изисквайки щракване, за да продължите.

Пробвам:

http://www.hawkee.com/snippet/9445/

person Hawkee    schedule 16.04.2012
comment
Една връзка не е достатъчна. Моля, копирайте/поставете вашата статия тук. - person aloisdg; 21.11.2016

$(function(){ 
    $(window).scroll(function(){
           if($(document).height()<=$(window).scrollTop()+$(window).height()+100){
               alert('end of page');
           }
       });
});

Някой поиска обяснение, така че ето го обяснението

тук $(document).height()-->е височината на целия документ. В повечето случаи това е равно на елемента от текущия документ.

$(window).height()-->е височината на прозореца (браузър) означава височината на всичко, което виждате в браузъра.

$(window).scrollTop()-->Свойството Element.scrollTop получава или задава броя пиксели, с които съдържанието на елемент се превърта нагоре. ScrollTop на елемент е измерване на разстоянието от върха на елемент до най-горното му видимо съдържание. Когато съдържанието на елемент не генерира вертикална лента за превъртане, тогава стойността му за scrollTop по подразбиране е 0.

$(document).height()<=$(window).scrollTop()+$(window).height()+100

добавете $(window).scrollTop() с $(window).height() сега проверете дали резултатът е равен на вашата височина на documnet или не. ако е равен, означава, че сте стигнали до края. добавяме и 100, защото искам да проверя преди 100-те пиксела от долната част на документа (забележка ‹= в състояние)

моля, поправете ме, ако греша

person venkatesh    schedule 31.03.2016
comment
Въпреки че този отговор вероятно е правилен и полезен, за предпочитане е да включите някакво обяснение заедно с него, за да обясните как помага за решаване на проблема. Това става особено полезно в бъдеще, ако има промяна (вероятно несвързана), която го кара да спре да работи и потребителите трябва да разберат как е работил някога. Благодаря! - person Hatchet; 31.03.2016

Ако имате елемент с възможност за превъртане, като 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 */
                }
            });
        });
person Vansuita Jr.    schedule 03.06.2016

Имах същия проблем, но не намерих подходящ плъгин за моите нужди. така че написах следния код. този код добавя шаблон към елемент, като получава данни с 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>

person Mojtaba    schedule 04.09.2017
comment
Това е наистина полезно. Не подценявайте този отговор само защото не е ТОП отговорът. Работи точно както трябва и е наистина бързо. - person mkdavor; 29.08.2020

Написах тази функция, използвайки идеите на Хюсеин и Ник, но исках да използва обещания за обратното повикване. Също така исках безкрайната зона за превъртане да бъде на фиксиран div, а не само на прозореца, ако div е изпратен в обекта с опции. Има пример за това във втората ми връзка по-долу. Предлагам да използвате библиотека с обещания като Q, ако искате да поддържате по-стари браузъри. Методът cb може или не може да бъде обещание и ще работи независимо от това.

Използва се така:

html

<div id="feed"></div>

js

var infScroll = infiniteScroll({
    cb: function () {
        return doSomethingPossiblyAnAJAXPromise();     
    }
});

Ако искате подаването да спре временно, можете да върнете false в метода cb. Полезно, ако сте достигнали края на емисията. Може да се стартира отново чрез извикване на върнатия обектен метод на infiniteScroll 'setShouldLoad' и подаване на 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;

}

1 пример за емисия с прозорец като скролер

2 пример за емисия с емисия като скролер

person John    schedule 26.03.2015