无限滚动

无限滚动用来在页面滚动到接近底部时加载新内容或进行其他操作。

在底部的无限滚动

你只需在可滚动的容器上添加“infinite-scroll”类,一般是页面滚动区域 - div.content

{% highlight html %}

底部无限滚动

{% endhighlight %}

其中:

javacript:

{% highlight js %} // 加载flag var loading = false; // 最多可加载的条目 var maxItems = 100; // 每次加载添加多少条目 var itemsPerLoad = 20; function addItems(number, lastIndex) { // 生成新条目的HTML var html = ''; for (var i = lastIndex + 1; i <= lastIndex + number; i++) { html += '
  • Item ' + i + '
  • '; } // 添加新条目 $('.infinite-scroll-bottom .list-container').append(html); } //预先加载20条 addItems(itemsPerLoad, 0); // 上次加载的序号 var lastIndex = 20; // 注册'infinite'事件处理函数 $(document).on('infinite', '.infinite-scroll-bottom',function() { // 如果正在加载,则退出 if (loading) return; // 设置flag loading = true; // 模拟1s的加载过程 setTimeout(function() { // 重置加载flag loading = false; if (lastIndex >= maxItems) { // 加载完毕,则注销无限加载事件,以防不必要的加载 $.detachInfiniteScroll($('.infinite-scroll')); // 删除加载提示符 $('.infinite-scroll-preloader').remove(); return; } // 添加新条目 addItems(itemsPerLoad, lastIndex); // 更新最后加载的序号 lastIndex = $('.list-container li').length; //容器发生改变,如果是js滚动,需要刷新滚动 $.refreshScroller(); }, 1000); }); {% endhighlight %}

    无限滚动事件

    事件(Event) 对象(Target) 描述(Description)
    infinite 可无限滚动的容器 div.content.infinite-scroll" 事件会在页面滚动至距底部还有特定距离(可在data-distance中配置)时触发

    无限滚动API

    有2个App方法:

    {% highlight js %} $.attachInfiniteScroll(container) - 为指定的HTML元素容器添加无限滚动事件监听器 parameters - 表示无限滚动容器的HTML元素或CSS选择器。必选。 {% endhighlight %} {% highlight js %} $.detachInfiniteScroll(container) - 从指定的HTML元素容器删除无限滚动事件监听器 parameters - 表示无限滚动容器的HTML元素或CSS选择器。必选。 {% endhighlight %}

    注意,仅在你使用$.detachInfiniteScroll方法删除过事件监听器后,才可能需要使用 $.attachInfiniteScroll方法,因为无限滚动组件的事件监听器会在“initPage”时被自动添加。

    在顶部的无限滚动

    如果你需要向上滚动到顶部时进行无限滚动,那么需要在 “content”添加额外的class infinite-scroll-top

    {% highlight html %}

    在顶部的无限滚动

    {% endhighlight %}

    javacript:

    {% highlight js %} $(function() { // 最多可加载的条目 var maxItems = 100; // 每次加载添加多少条目 var itemsPerLoad = 20; function addItemsTop(number, lastIndex) { // 生成新条目的HTML var html = ''; for (var i = lastIndex+ number; i > lastIndex ; i--) { html += '
  • 条目'+i+'
  • '; } // 添加新条目 $('.infinite-scroll .list-container').prepend(html); } var timer = false; $(document).on('infinite', '.infinite-scroll-top',function() { var lastIndex = $('.infinite-scroll-top .list-block li').length; var lastLi = $(".list-container li")[0]; var scroller = $('.infinite-scroll-top'); var scrollHeight = scroller[0].scrollHeight; // 获取当前滚动元素的高度 // 如果正在加载,则退出 if (timer) { clearTimeout(timer); } // 模拟1s的加载过程 timer = setTimeout(function() { addItemsTop(itemsPerLoad,lastIndex); $.refreshScroller(); // 将滚动条的位置设置为最新滚动元素高度和之前的高度差 scroller.scrollTop(scroller[0].scrollHeight - scrollHeight); }, 1000); }); }) {% endhighlight %}

    多个标签页下的无限滚动

    一个页面的多个标签中可单独初始化infinite-scroll,在需要无限滚动的tab上加"infinite-scroll"

    {% highlight html %}

    其他内容区域

    其他内容区域

    ...

    其他内容区域

    This is tab 1-1 content

    This is tab 1-2 content

    13855589778

    • 条目
    • ....
    • 条目
    • 条目
    • ....
    • 条目
    {% endhighlight %}

    javacript:

    {% highlight js %} $(document).on("pageInit", function() { //多个标签页下的无限滚动 var loading = false; // 每次加载添加多少条目 var itemsPerLoad = 20; // 最多可加载的条目 var maxItems = 100; var lastIndex = $('.list-container li')[0].length; function addItems(number, lastIndex) { // 生成新条目的HTML var html = ''; for (var i = lastIndex + 1; i <= lastIndex + number; i++) { html += '
  • 新条目
  • '; } // 添加新条目 $('.infinite-scroll.active .list-container').append(html); } $(page).on('infinite', function() { // 如果正在加载,则退出 if (loading) return; // 设置flag loading = true; var tabIndex = 0; if($(this).find('.infinite-scroll.active').attr('id') == "tab2"){ tabIndex = 0; } if($(this).find('.infinite-scroll.active').attr('id') == "tab3"){ tabIndex = 1; } lastIndex = $('.list-container').eq(tabIndex).find('li').length; // 模拟1s的加载过程 setTimeout(function() { // 重置加载flag loading = false; if (lastIndex >= maxItems) { // 加载完毕,则注销无限加载事件,以防不必要的加载:$.detachInfiniteScroll($('.infinite-scroll').eq(tabIndex));多个无线滚动请自行根据自己代码逻辑判断注销时机 // 删除加载提示符 $('.infinite-scroll-preloader').eq(tabIndex).hide(); return; } addItems(itemsPerLoad,lastIndex); // 更新最后加载的序号 lastIndex = $('.list-container').eq(tabIndex).find('li').length; $.refreshScroller(); }, 1000); }); }); {% endhighlight %}