在最新的H5开发项目中,需要开发上拉加载更多的功能,如何实现上拉加载更多,网上有很多插件可以实现,如:mescroll、mui、isScroll等等,最初我也是选择了使用插件,但在使用过程中发现了如果开发页面不是全局下拉刷新时,在IOS、Android上会出现卡顿及无法拉动的情况,因此感觉某些插件不适合做局部刷新,于是想用Jquery实现在移动端的上拉加载更多功能,在实现之后感觉还不错哒,在此记录一下自己的成果,嘻嘻(#^.^#)。

  在最新的H5开发项目中,需要开发上拉加载更多的功能,如何实现上拉加载更多,网上有很多插件可以实现,如:mescroll、mui、isScroll等等,最初我也是选择了使用插件,但在使用过程中发现了如果开发页面不是全局下拉刷新时,在IOS、Android上会出现卡顿及无法拉动的情况,因此感觉某些插件不适合做局部刷新,于是想用Jquery实现在移动端的上拉加载更多功能,在实现之后感觉还不错哒,在此记录一下自己的成果,嘻嘻(#^.^#)。

  首先根据产品需求写出页面布局:如下图:

jquery 添加loading 效果_ide

  功能需求是点击母婴用品列表切换类别,并实现上拉加载数据。

$(window).scroll(function(){})

$(window).scroll(function(){
    var scrollTop = $(this).scrollTop();    //滚动条距离顶部的高度
    var scrollHeight = $(document).height();   //当前页面的总高度
    var clientHeight = $(this).height();    //当前可视的页面高度
    if(scrollTop + clientHeight >= scrollHeight - 50){   //距离顶部+当前高度 >=文档总高度 即代表滑动到底部 注:-50 上拉加载更灵敏
             //加载数据
    }
});

  理清思路,具体业务逻辑js代码如下:

var pageAjax = {
     pageNo : 1,
        pageSize : 10,
        loader : $(".mui-loading"), //加载中
        endText : $(".mui-end"),     //结束
        loadMore : $(".mui-more"),  //加载更多
        promotion_id : $("input[name='promotion_id']").val(),
        curNavIndex : $(".pro-top .active").data('id'),
        shiftNav : $(".product-search .pro-top").find("li"),
        throttle : function(func,delay){     //延缓滚动加载次数  防止抖动
            var timer = null;
            var startTime = Date.now();
            return function(){
                var curTime = Date.now();
                var remaining = delay - (curTime - startTime);
                var context = this;
                var args = arguments;
                clearTimeout(timer);
                if(remaining <= 0){
                    func.apply(context,args);
                    startTime = Date.now();
                }else{
                    timer = setTimeout(func,remaining);
                }
            }
        },
        getDataInit : function(dataId){
            mui.ajax("{:url('Specialactivity/catGoodsList')}",{
                data:{
                    num : pageAjax.pageSize,
                    page : pageAjax.pageNo,
                    cat_id : dataId,
                    promotion_id : pageAjax.promotion_id
                },
                dataType:'json',
                type:'post',
                timeout:10000,
                headers:{'Content-Type':'application/json'},   
                beforeSend:function(){
                    pageAjax.loader.show();
                    pageAjax.loadMore.hide();
                    pageAjax.endText.hide();
                },      
                success:function(data){
                    var listData=[];
                    //console.log(data);
                    pageAjax.loader.hide();
                    if(data.code == 200){
                        var list = data.data;
                        var html = $("#goodsTemp").render(list);
                        $("#dataList").append(html);
                        pageAjax.loadMore.show();           
                    }
                    if(data.code == 400){
                        pageAjax.endText.show();
                        pageAjax.loader.hide();
                        pageAjax.loadMore.hide();
                    }
                },
                error:function(data){
                    console.log(data);
                }                
            });
        },
        clickAjax : function(){
            pageAjax.shiftNav.on("tap",function(){
                pageAjax.pageNo = 1;             //重置页码为1
                $("#dataList").html("");         //清空容器内容
          pageAjax.loadMore.hide();        //清空加载更多
                var cat_id = $(this).data("id"); //获取类别id
                $(this).addClass("active").siblings("li").removeClass("active");
                pageAjax.getDataInit(cat_id);                
            });
        },
        scrollFuc : function(){
            $(window).scroll(pageAjax.throttle(function(){
                var scrollTop = $(this).scrollTop();    //滚动条距离顶部的高度
                var scrollHeight = $(document).height();   //当前页面的总高度
                var clientHeight = $(this).height();    //当前可视的页面高度
                if(scrollTop + clientHeight >= scrollHeight - 50){   //距离顶部+当前高度 >=文档总高度 即代表滑动到底部
                    if($(".mui-end").is(":hidden")){
                        pageAjax.pageNo++;
                        var cat_id = $(".pro-top").find("li.active").data("id");                    
                        pageAjax.getDataInit(cat_id); 
                    }else{
               pageAjax.loadMore.hide();
            }             
                }
            },2000));
        }

    };
    $(function(){
        mui.init();
        $.views.settings.delimiters("<%", "%>");
     $.views.converters({
        parseNum: function(value){
          return parseInt(value);
        }
    });
        $(".mui-loading,.mui-end").hide(); 
        pageAjax.clickAjax();
        pageAjax.scrollFuc();
        pageAjax.getDataInit(pageAjax.curNavIndex);
});

  HTML代码如下:

<div class="product-search">
    <ul class="pro-top">
        <li class="" data-id="3">母婴用品</li>
        <li data-id="7" class="active">居家生活</li>
    </ul>                
</div>
<div class="pro-bottom">
    <ul id="dataList" ></ul>
    <div class="mui-loading">
        <div class="mui-spinner"></div>
    </div>
    <div class="mui-more">
        <p style="text-align: center;font-size: 10px;">-- 上拉加载更多 --</p>
    </div>
    <div class="mui-end">
        <p style="text-align: center;font-size: 10px;">-- 我是有底线的 --</p>
    </div>
</div>

pageAjax.throttle()

if($(".mui-end").is(":hidden"))

  此文章旨在记录思路O(∩_∩)O啦啦~~