最近自己做一个web app需要用到上拉查询下页数据,网上看了很多很多帖子,发现并不能快速的套用,总是会出现各种问题无法使用,于是无奈自己跑去看了官方api文档,终于做了出来,至此做个笔记,以后用到可以直接复制粘贴套用,好了不废话了,进入正题。
1.需要引用 mescroll.min.css , mescroll.min.js
这两个文件可以去http://www.mescroll.com/load.html下载,
也可以选择引用cdn:
// jsdelivr的CDN: <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/mescroll.js@1.4.0/mescroll.min.css"> <script src="https://cdn.jsdelivr.net/npm/mescroll.js@1.4.0/mescroll.min.js" charset="utf-8"></script>
2.添加以下布局(容纳操作内容的容器)
<div id="mescroll" class="mescroll"> //id可以改,而"mescroll"的class不能删 <div> //这个div不能删,否则上拉加载的布局会错位.(可以改成ul或者其他容器标签) //内容... </div> </div>
3.在head中添加style固定mescroll的div高度. 推荐通过定位的方式,简单快捷: (点此查看其他方法)
<style> .mescroll{ position: fixed; top: 44px; bottom: 0; height: auto; /*如设置bottom:50px,则需height:auto才能生效*/ } </style>
4. 创建mescroll对象(我是单独建了一个js文件) :
var mescroll = new MeScroll("mescroll", { //第一个参数"mescroll"对应上面布局结构div的id //如果您的下拉刷新是重置列表数据,那么down完全可以不用配置,具体用法参考第一个基础案例 //解析: down.callback默认调用mescroll.resetUpScroll(),而resetUpScroll会将page.num=1,再触发up.callback down: { auto:false,//是否在初始化完毕之后自动执行下拉回调callback; 默认true callback: downCallback, //下拉刷新的回调 }, up: { auto:true,//初始化完毕,是否自动触发上拉加载的回调 isBoth: true, //上拉加载时,如果滑动到列表顶部是否可以同时触发下拉刷新;默认false,两者不可同时触发; 这里为了演示改为true,不必等列表加载完毕才可下拉; isBounce: false, //此处禁止ios回弹,解析(务必认真阅读,特别是最后一点): http://www.mescroll.com/qa.html#q10 callback: upCallback, //上拉加载的回调 /*toTop:{ //配置回到顶部按钮 src : "../res/img/mescroll-totop.png", //默认滚动到1000px显示,可配置offset修改 //offset : 1000 }*/ page: { num: 0, //当前页 默认0,回调之前会加1; 即callback(page)会从1开始 size: 5 //每页数据条数,默认10 } } });
5. 处理回调 :
//下拉刷新的回调 function downCallback() { $.ajax({ url: '', success: function(data) { //联网成功的回调,隐藏下拉刷新的状态; mescroll.endSuccess(); //无参 //设置数据 //setXxxx(data);//自行实现 TODO }, error: function(data) { //联网失败的回调,隐藏下拉刷新的状态 mescroll.endErr(); } }); } //上拉加载的回调 page = {num:1, size:5};(这里size我在上面设置成5了,默认是10) num:当前页 默认从1开始, size:每页数据条数,默认10 function upCallback(page) { /* var pageIndex = page.num-1;*/ //若想从num=0开始,就把前面的注释打开。 $.ajax({ url: 'xxxxxxxx' + '?' + 'pageNum=' + page.num + '&pageSize=' + page.size, dataType:'json', type:'GET', success: function(curPageData) { //方法二(推荐): 后台接口有返回列表的总数据量 totalSize //必传参数(当前页的数据个数, 总数据量)
mescroll.endBySize(curPageData.shopList.length, curPageData.count);
//这里面还有一堆方法,根据自己后端情况选择
//联网成功的回调,隐藏下拉刷新和上拉加载的状态;
//mescroll会根据传的参数,自动判断列表如果无任何数据,则提示空,显示empty配置的内容;
//列表如果无下一页数据,则提示无更多数据,(注意noMoreSize的配置)
//方法一(推荐): 后台接口有返回列表的总页数 totalPage
//必传参数(当前页的数据个数, 总页数)
//mescroll.endByPage(curPageData.length, totalPage);
//方法二(推荐): 后台接口有返回列表的总数据量 totalSize
//必传参数(当前页的数据个数, 总数据量)
//mescroll.endBySize(curPageData.length, totalSize);
//方法三(推荐): 您有其他方式知道是否有下一页 hasNext
//必传参数(当前页的数据个数, 是否有下一页true/false)
//mescroll.endSuccess(curPageData.length, hasNext);
//方法四 (不推荐),会存在一个小问题:比如列表共有20条数据,每页加载10条,共2页.
//如果只根据当前页的数据个数判断,则需翻到第三页才会知道无更多数据
//如果传了hasNext,则翻到第二页即可显示无更多数据.
//mescroll.endSuccess(curPageData.length);
//结束下拉刷新的 mescroll.endSuccess()无参.
//结束上拉加载 curPageData.length必传的原因:
1.使配置的noMoreSize生效
2.判断是否有下一页的首要依据: 当传的值小于page.size时,则一定会认为无更多数据.
比传入的totalPage, totalSize, hasNext具有更高的判断优先级
3.当传的值等于page.size时,才会取totalPage, totalSize, hasNext判断是否有下一页
传totalPage, totalSize, hasNext主要目的是避免方法四描述的小问题
//设置列表数据,自行实现,里面写你遍历像前台塞值过程 setListData(curPageData); }, error: function(e) { //联网失败的回调,隐藏下拉刷新和上拉加载的状态 mescroll.endErr(); } }); } //具体实现自行定义 function setListData(curPageData){ var html = ''; //这里,我后台返回的是个map集合,所以遍历店铺列表,拼接出卡片集合,具体自行定义 curPageData.shopList.map(function(item, index) { html += '' + '<div class="withdrawals-panel card" data-shop-id="' + item.shopId + '">' + '<div class="groupby-img-panle "><a href="#"><img src="' + item.shopImg + '" class="am-img-responsive" /></a></div>' + '<div class="groupby-info-panle">' + '<h3>' + item.shopName + '</h3>' + '<p>' + item.shopDesc + '</p>' + '<p>' + new Date(item.lastEditTime).Format("yyyy-MM-dd") + '</p>' + '</div>' + '</div>'; }); $('.list-div').append(html); }
至此功能已经实现,以此笔记 记录使用过程。