笔记-移动端滑动到底部自动加载下一页内容

公司微信公众号的网页由ThinkPHP框架的模板生成,由一个需求是滑动到底部时自动加载下一页内容。

1、网页结构

网页分为两个部分,顶部固定导航栏,下部有一个page容器,内部滚动显示。

2、加载下一页的流程

当滑动到底部时,发送ajax请求下一页内容,内容返回后,将内容拼接成HTML结构后插入原有的page下。

页面是后端已经分好的,所以ajax请求的数据中包含一个currentpage变量,这个变量每次请求时自增1,表示请求下一页。

3、如何实现

想着原理比较简单,所以自己实现了一下,实现思路便是通过滚动事件监听“加载更多”这个page最底部的div的位置,他的offset.top+自身height=整个屏幕height时,便代表滚动到底部了,可以开始ajax请求了。

根据实际项目需求,简单封装了一下这个过程:

function Loading_zc(isleft_bool, post_data_json, create_html_func, url_str) {
    this.isleft = isleft_bool;
    this.isloading = false;
    this.url = url_str;
    this.info = post_data_json;
    this.create_html = create_html_func.bind(this);
    this.box_height = $(‘#container‘).height();
    this.loading_timer = null;
}

Loading_zc.prototype = {
    constructor: Loading_zc,

    load_more: function() {
        var _this = this;
        $(‘.weui-loadmore‘).html(‘<span class="weui-loadmore__tips click_to_load">加载更多</span>‘);
        $(".click_to_load").click(function(event) {
            if (!_this.isloading) {
                _this.fetch_by_ajax(_this.url, _this.info);
            }
        });
    },

    in_loading: function() {
        $(‘.weui-loadmore‘).html(‘<i class="weui-loading"></i><span class="weui-loadmore__tips">正在加载</span>‘);
    },

    no_more: function() {
        $(‘.weui-loadmore‘).html(‘<span class="weui-loadmore__tips">无更多数据</span>‘);
    },

    show_date: function(str) {
        var d = + str.substr(6,13);
        var _date = new Date(d);
        var year = _date.getFullYear();
        var month = (‘‘ + (+_date.getMonth() + 1)).length == 2 ? (+_date.getMonth() + 1) : ‘0‘ + (+_date.getMonth() + 1);
        var date = _date.getDate();
        return year+ ‘/‘ + month + ‘/‘ + date;
    },

    show_week: function(str) {
        var d = + str.substr(6,13);
        var _date = new Date(d);
        var day = _date.getDay();
        var week_arr=["周日","周一","周二","周三","周四","周五","周六"];
        return week_arr[day];
    },

    fetch_by_ajax: function(url, info) {
        var _this = this;
        console.log(‘start loading‘);
        this.isloading = true;
        this.in_loading();
        this.info.currentpage += 1;

        $.ajax({
            url: url,
            type: ‘POST‘,
            dataType: ‘json‘,
            data: {info: info},
            success: function(data) {
                _this.isloading = false;

                if (data.isleft) {
                    _this.load_more();
                }else{
                    _this.no_more();
                    _this.isleft = false;
                }

                var _h = _this.create_html(data.datas);
                $(_h).insertBefore(‘.weui-loadmore‘);
            }
        });
    },

    init: function() {
        var _this = this;
        $(".page").on(‘scroll‘, function() {
            if (!_this.isleft || _this.isloading) {
                return false;
            }
            if (_this.loading_timer) {
                clearTimeout(_this.loading_timer);
            }

            _this.loading_timer = setTimeout(function() {
                var o = $(‘.weui-loadmore‘).offset();
                if (o.top + o.height - 3 <= _this.box_height) {
                    _this.fetch_by_ajax(_this.url, _this.info);
                }
            }, 100);
        });

        $(".click_to_load").click(function(event) {
            if (!_this.isloading) {
                _this.fetch_by_ajax(_this.url, _this.info);
            }
        });
    }
};

调用逻辑:

    // -----------------------------------
    // ---------loading_zc.js-ajax加载数据
    // 1-是否有剩余数据
    var isleft = "{$isleft}";
    // 2-拼装post数据
    var regcode = "{$regcode}";
    var consumermid = + "{$consumermid}";
    var startTime = "{$starttime}";
    var endTime = "{$endtime}";
    var currentpage = + "{$currentpage}";
    var info = {
        "regcode": regcode,
        "consumermid": consumermid,
        "startTime": startTime,
        "endTime": endTime,
        "currentpage": currentpage
    };
    // 3-将ajax返回数据进行拼装
    function create_html(datas) {
        var len = datas.length;
        var _html = ‘‘;

        for (var i = 0; i < len; i++) {
            var data = JSON.parse(datas[i]);
            console.log(data);
            var pt = data.PayTime.substr(6, 10);
            var item = ‘<a href="/WxPurchase/purchaseHistoryDetail?billmid=‘ +
                       data.Mid + ‘&regcode={$regcode}&regname={$regname}&payprice=‘ +
                       data.PayTotal + ‘&petname=‘ + data.PetName + ‘&paytime=‘ + pt + ‘">‘ +
                         ‘<div class="weui-panel weui-cell_access">‘ +
                           ‘<div class="weui-panel__bd">‘ +
                             ‘<div class="weui-media-box weui-media-box_text">‘ +
                               ‘<h4 class="weui-media-box__title">-¥‘ + data.PayTotal + ‘</h4>‘ +
                               ‘<p class="weui-media-box__desc">‘ + this.show_date(data.PayTime) + ‘(‘ + this.show_week(data.PayTime) + ‘)‘ +
                               ‘&nbsp;&nbsp;&nbsp;&nbsp;宠物:‘ + data.PetName + ‘</p></div></div><span class="weui-cell__ft"></span></div></a>‘;
            _html += item;
        }

        return _html;
    }
    // 4-post目标url
    var url = ‘/WxPurchase/ajaxPurchaseHistory‘;
    // 5-创建实例并加载
    var loading = new Loading_zc(isleft, info, create_html, url);
    loading.init();
    // -----------------------------------

其中监听滚动的时候注意函数节流,快速滚动时不要每次都计算一下底部div的位置。

show_date和show_week在业务的个别情况下用到。

4、实现效果

效果就是像第一个图一样(这里每页显示1个),由于内容太少无法滚动,所以可以使用点击加载更多来实现加载,这时“加载更多”会变成“正在加载”,当请求完毕,会根据请求结果中的isleft(表示是否还有更多数据可以请求,这里是后端给的)字段来判断是显示“加载更多”或者显示“无更多数据”。

5、下一步需要解决的问题

跳转到其他链接后再点击返回到这一页时,ajax请求结果便都没有了,这个问题可能可以通过处理history对象来解决。

时间: 2024-12-28 11:06:40

笔记-移动端滑动到底部自动加载下一页内容的相关文章

手机H5页面,滑动到底部自动加载下一页内容

做公众号项目中有如下场景,一个H5页面有列表数据,不考虑一次加载所有数据,故需要分页操作,解决方案为滑动到底部自动加载下一页内容.直接在H5的js当中实现. 主要使用jquery的scroll()方法: 当用户滚动指定的元素时,会发生 scroll 事件. scroll 事件适用于所有可滚动的元素和 window 对象(浏览器窗口). scroll() 方法触发 scroll 事件,或规定当发生 scroll 事件时运行的函数. 代码如下: $(window).scroll(function()

页面滚动到底部自动加载下一页功能的实现

页面滚动到底部自动加载下一页功能的实现,效果见本博首页 1.endlesspage.js文件内容 var gPageSize = 10; var i = 1; //设置当前页数,全局变量 var finished = false; var dataUrl = ''; $(function () { //根据页数读取数据 function getData(pagenumber) { //console.log(i); $.get(dataUrl, { pagesize: gPageSize, p:

页面滑动底部自动加载下一页信息

最近移动端的项目做的比较多,记录下一种非常使用的移动端分页方式. 一  前端页面javascript代码 设置一个全局变量. var pageIndex = 1; 然后添加页面滚动事件,如果滑动到页面底部,自动执行GetList()方法,从数据库获取第二页的数据,然后转化成json返回给前台页面. $(document).ready(function () { $(window).scroll(function () { var nowScrolledHeight = document.docu

Android LRecyclerView 操作案例分享-实现下拉刷新、滑动到底部自动加载

一直想抽空写下这个开源项目,但是各种原因没有抽时间,今天还是趁着工作间隙写下了这篇博客,与大家分享. 简介 LRecyclerView是支持addHeaderView. addFooterView.下拉刷新.分页加载数据的RecyclerView. 它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView.FooterView,并且不需要对你的Adapter做任何修改. 主要功能 下拉刷新.滑动到底部自动加载下页数据: 可以方便添加Header和Foot

Android数据分批加载-滑动到底部自动加载列表

Android数据分批加载-滑动到底部自动加载列表 2014年5月9日 本博文介绍如何进行数据分批加载,在应用开发当中会经常使用到ListView,点击更多加载数据是我们经常简单,为了提供用户体验,当用户将列表滚动到底部自动加载数据,这样的形式用得比较多. 下面给大家提供的例子是,每次模拟20条数据,滑动到底部时再请求20条数据直到请求到限定页数为止 具体代码实现: /08_Datapageload/src/com/wwj/datapageload/MainActivity.java packa

RecyclerView滑动到底部自动加载

你经常听到“上拉加载”这样的字眼吗?你知道这个功能是怎么实现的吗?这篇文章记录了我对“上拉加载”的实现,与大家一起分享. “上拉加载”针对的是RecyclerView或者Listview这样的列表控件(本文以RecyclerView为例),一般和“数据分页”配合使用,旨在实现“分页加载,随用随取”,从而避免了一个接口返回过多的数据. RecyclerView每加载一个item都会调用一次onBindViewHolder方法,并且只在item由不可见变为可见的时候才会调用此方法.我们可以通过onB

探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多

在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个基础上进行改写.今天尝试一下使用SwipeRefreshLayout配合自定义ListView实现下拉刷新.滑到底部自动加载更多的功能. 效果图如下所示,在进入页面的时候加载自动刷新,滑到底部自动加载更多,当数据已经加载完成则显示已经加载完成,,否则上拉任可继续加载 先贴一下项目结构图吧,这样可能对

当滚动条滚动到页面底部自动加载增加内容的js代码

这篇文章主要介绍了如何使用javscript实现滚动条滚动到页面底部自动加载增加页面内容,需要的朋友可以参考下..1,注册页面滚动事件,window.onscroll = function(){ }; 2,相关获取页面高度.滚动条位置.文档高度的函数: 复制代码 代码如下://获取滚动条当前的位置 function getScrollTop() { var scrollTop = 0; if (document.documentElement && document.documentEle

关于JQuery实现滚动到底部自动加载中应当注意的地方

在滚动到底部自动加载时常常用到以下代码 container.bind('scroll', function(){ if(container.scrollTop() + container.height() >= container.prop("scrollHeight")){ loadNextPage(); } }); 其中container.prop("scrollHeight") 就相当于 container.get(0).scrollHeight 用于获