Бесконечная полоса прокрутки в Javascript - PullRequest
4 голосов
/ 28 февраля 2011

Я пишу программу для просмотра книг, которая динамически загружает контент, когда пользователь прокручивает его.Первая проблема, которую я имею, состоит в том, как настроить полосу прокрутки.Поскольку мы храним только абзацы в нашей базе данных без информации о размере, я могу только догадываться, какой длины документ.Основываясь на таком предположении, я, возможно, захочу создать прокручиваемое окно, которое появляется длиной 10000 пикселей и загружает абзацы по мере необходимости.

Самый простой способ, который я могу себе представить, - это на самом деле создать DIV длиной 10000 пикселей и абсолютнопоместите встроенный div в положение прокрутки, показывающее мое содержимое.

Есть ли способ полностью контролировать полосу прокрутки в Javascript (установка ее минимального, максимального, положения, относительного размера большого пальца) или я иду простым упомянутым способомвыше или есть другой способ сделать это?

Я использую среду ExtJS, но, похоже, она не предлагает никакой прямой помощи, хотя V4 включает бесконечную сетку.

Ответы [ 3 ]

3 голосов
/ 28 февраля 2011

Вот несколько способов:

Masonry Infinite Scroll http://desandro.com/demo/masonry/docs/infinite-scroll.html

Cpde Образец:

$wall.infinitescroll({
  navSelector  : '#page_nav',  // selector for the paged navigation 
  nextSelector : '#page_nav a',  // selector for the NEXT link (to page 2)
  itemSelector : '.box',     // selector for all items you'll retrieve
  loadingImg : 'img/loader.gif',
  donetext  : 'No more pages to load.',
  debug: false,
  errorCallback: function() { 
    // fade out the error message after 2 seconds
    $('#infscr-loading').animate({opacity: .8},2000).fadeOut('normal');   
  }
  },
  // call masonry as a callback
  function( newElements ) { 
    $(this).masonry({ appendedContent: $( newElements ) }); 
  }
);

AJAXianWay (без плагина) http://ajaxian.com/archives/implementing-infinite-scrolling-with-jquery

Код:

//Scroll Detection
$(window).scroll(function(){
        if  ($(window).scrollTop() == $(document).height() - $(window).height()){
           lastPostFunc();
        }
});

//Loading More content
function lastPostFunc()
{
    $(’div#lastPostsLoader’).html(’<img src="bigLoader.gif"/>’);
    $.post("scroll.asp?action=getLastPosts&lastID=" + $(".wrdLatest:last").attr("id"),   

    function(data){
        if (data != "") {
        $(".wrdLatest:last").after(data);           
        }
        $(’div#lastPostsLoader’).empty();
    });
};

Бесконечный свиток Плагин jQuery (изначально плагин WordPress) http://www.infinite -scroll.com/infinite-scroll-jquery-plugin/

Пример кода:

// infinitescroll() is called on the element that surrounds 
// the items you will be loading more of
  $('#content').infinitescroll({

    navSelector  : "div.navigation",            
                   // selector for the paged navigation (it will be hidden)
    nextSelector : "div.navigation a:first",    
                   // selector for the NEXT link (to page 2)
    itemSelector : "#content div.post"          
                   // selector for all items you'll retrieve
  });
All options


// usage:
// $(elem).infinitescroll(options,[callback]);

// infinitescroll() is called on the element that surrounds 
// the items you will be loading more of
$('#content').infinitescroll({

  navSelector  : "div.navigation",            
                 // selector for the paged navigation (it will be hidden)

  nextSelector : "div.navigation a:first",    
                 // selector for the NEXT link (to page 2)

  itemSelector : "#content div.post",          
                 // selector for all items you'll retrieve

  debug        : true,                        
                 // enable debug messaging ( to console.log )

  loadingImg   : "/img/loading.gif",          
                 // loading image.
                 // default: "http://www.infinite-scroll.com/loading.gif"

  loadingText  : "Loading new posts...",      
                 // text accompanying loading image
                 // default: "<em>Loading the next set of posts...</em>"

  animate      : true,      
                 // boolean, if the page will do an animated scroll when new content loads
                 // default: false

  extraScrollPx: 50,      
                 // number of additonal pixels that the page will scroll 
                 // (in addition to the height of the loading div)
                 // animate must be true for this to matter
                 // default: 150

  donetext     : "I think we've hit the end, Jim" ,
                 // text displayed when all items have been retrieved
                 // default: "<em>Congratulations, you've reached the end of the internet.</em>"

  bufferPx     : 40,
                 // increase this number if you want infscroll to fire quicker
                 // (a high number means a user will not see the loading message)
                 // new in 1.2
                 // default: 40

  errorCallback: function(){},
                 // called when a requested page 404's or when there is no more content
                 // new in 1.2                   

  localMode    : true
                 // enable an overflow:auto box to have the same functionality
                 // demo: http://paulirish.com/demo/infscr
                 // instead of watching the entire window scrolling the element this plugin
                 //   was called on will be watched
                 // new in 1.2
                 // default: false


    },function(arrayOfNewElems){

     // optional callback when new content is successfully loaded in.

     // keyword `this` will refer to the new DOM content that was just added.
     // as of 1.5, `this` matches the element you called the plugin on (e.g. #content)
     //                   all the new elements that were found are passed in as an array

});

// load all post divs from page 2 into an off-DOM div
$('<div/>').load('/page/2/ #content div.post',function(){ 
    $(this).appendTo('#content');    // once they're loaded, append them to our content area
});

Загрузка содержимого при прокрутке с помощью jQuery (еще один пример без PLugin) http://www.webresourcesdepot.com/load-content-while-scrolling-with-jquery/

Код:

function lastPostFunc() 
{ 
    $('div#lastPostsLoader').html('<img src="bigLoader.gif">');
    $.post("scroll.asp?action=getLastPosts&lastID=" + $(".wrdLatest:last").attr("id"),     

    function(data){
        if (data != "") {
        $(".wrdLatest:last").after(data);            
        }
        $('div#lastPostsLoader').empty();
    });
}; 

$(window).scroll(function(){
        if  ($(window).scrollTop() == $(document).height() - $(window).height()){
           lastPostFunc();
        }
});
3 голосов
/ 17 марта 2011

Другие ответы на этот вопрос просто расширили содержание, когда пользователь достиг дна, это не то, что я хотел. Мне нужно отобразить полноразмерную, но малонаселенную, прокручиваемую область. Решение, которое я придумал, было довольно простым:

Я создал прокручиваемый DIV (назовите его book) с набором внутренних DIV для каждого абзаца в книге. Мне нужно сделать это по абзацу, так как это имеет особое значение в нашем приложении, иначе вы, вероятно, сделали бы это по странице. Размер DIV абзаца имеет размер по умолчанию, основанный на предположении, насколько они велики.

Когда книга DIV прокручивается, javascript вычисляет, какие абзацы DIV теперь видны. Те, которые видны, но не заполнены, объединяются. Затем веб-служба используется для заполнения требуемых абзацев DIV и их точного размера.

Алгоритм, который я использую, связывает некоторые окружающие (невидимые) абзацы, чтобы дать некоторую эффективность при чтении вперед и фрагментации. Ленивый загрузчик читает дополнительные параграфы после обновления экрана, чтобы обеспечить более плавную прокрутку.

Это оказалось слишком просто. Тяжелая работа заключается в алгоритмах разбиения на фрагменты и добавлении ленивого считывателя.

1 голос
/ 28 февраля 2011

Попробуйте этот бесконечный скроллер, который я нашел в журнале Smashing Magazine этим утром:

http://markholton.com/posts/17-infiniscroll-jquery-plugin-released

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...