基于HTML5上使用iScroll实现下拉刷新,上拉加载更多


Posted in Javascript onMay 21, 2016

前言

前一段有个手机端的项目需要用到下拉刷新和上拉加载更多的效果,脑海里第一反映就是微博那种效果,刚开始的理解有些偏差,以为下拉也是追加数据,上拉也是追加数据,后请教同事后发现其实下拉只是刷新最新数据而已,上拉是追加数据。

使用技巧

1、引用iScroll.js, 在初始化时添加两个事件监听:touchMove、DOMContentLoaded。

2、实现iScroll插件的onScrollEnd事件, 也就是在这个事件里调用你自己的ajax方法实现数据的刷新和追加。

3、上拉加载更多请求后台时就相当于分页请求数据,这时候需要在ajax请求时发送pageIndex参数,而初始化加载时需要从后台返回一个pageCount以便前台判断。

4、最关键的就是实现下拉刷新方法(pullDownAction)和上拉加载更多(pullUpAction)方法。

运行效果图

基于HTML5上使用iScroll实现下拉刷新,上拉加载更多

实现方法

var  myScroll,
 pullDownEl, pullDownOffset,
 pullUpEl, pullUpOffset,
 generatedCount = 0;

/**
 * 下拉刷新 (自定义实现此方法)
 * myScroll.refresh(); 数据加载完成后,调用界面更新方法
 */
function pullDownAction () {
 setTimeout(function () { 
 var el, li, i;
 el = document.getElementById('thelist');

 for (i=0; i<3; i++) {
 li = document.createElement('li');
 li.innerText = 'Generated row ' + (++generatedCount);
 el.insertBefore(li, el.childNodes[0]);
 }
 
 myScroll.refresh(); //数据加载完成后,调用界面更新方法 
 }, 1000); 
}

/**
 * 滚动翻页 (自定义实现此方法)
 * myScroll.refresh(); // 数据加载完成后,调用界面更新方法
 */
function pullUpAction () {
 setTimeout(function () { // <-- Simulate network congestion, remove setTimeout from production!
 var el, li, i;
 el = document.getElementById('thelist');

 for (i=0; i<3; i++) {
 li = document.createElement('li');
 li.innerText = 'Generated row ' + (++generatedCount);
 el.appendChild(li, el.childNodes[0]);
 }
 
 myScroll.refresh(); //数据加载完成后,调用界面更新方法 
 }, 1000); 
}

/**
 * 初始化iScroll控件
 */
function loaded() {
 pullDownEl = document.getElementById('pullDown');
 pullDownOffset = pullDownEl.offsetHeight;
 pullUpEl = document.getElementById('pullUp'); 
 pullUpOffset = pullUpEl.offsetHeight;
 
 myScroll = new iScroll('wrapper', {
 scrollbarClass: 'myScrollbar', 
 useTransition: false, 
 topOffset: pullDownOffset,
 onRefresh: function () {
 if (pullDownEl.className.match('loading')) {
 pullDownEl.className = '';
 pullDownEl.querySelector('.pullDownLabel').innerHTML = '下拉刷新...';
 } else if (pullUpEl.className.match('loading')) {
 pullUpEl.className = '';
 pullUpEl.querySelector('.pullUpLabel').innerHTML = '上拉加载更多...';
 }
 },
 onScrollMove: function () {
 if (this.y > 5 && !pullDownEl.className.match('flip')) {
 pullDownEl.className = 'flip';
 pullDownEl.querySelector('.pullDownLabel').innerHTML = '松手开始更新...';
 this.minScrollY = 0;
 } else if (this.y < 5 && pullDownEl.className.match('flip')) {
 pullDownEl.className = '';
 pullDownEl.querySelector('.pullDownLabel').innerHTML = '下拉刷新...';
 this.minScrollY = -pullDownOffset;
 } else if (this.y < (this.maxScrollY - 5) && !pullUpEl.className.match('flip')) {
 pullUpEl.className = 'flip';
 pullUpEl.querySelector('.pullUpLabel').innerHTML = '松手开始更新...';
 this.maxScrollY = this.maxScrollY;
 } else if (this.y > (this.maxScrollY + 5) && pullUpEl.className.match('flip')) {
 pullUpEl.className = '';
 pullUpEl.querySelector('.pullUpLabel').innerHTML = '上拉加载更多...';
 this.maxScrollY = pullUpOffset;
 }
 },
 onScrollEnd: function () {
 if (pullDownEl.className.match('flip')) {
 pullDownEl.className = 'loading';
 pullDownEl.querySelector('.pullDownLabel').innerHTML = '加载中...'; 
 pullDownAction(); // ajax call
 } else if (pullUpEl.className.match('flip')) {
 pullUpEl.className = 'loading';
 pullUpEl.querySelector('.pullUpLabel').innerHTML = '加载中...'; 
 pullUpAction(); // ajax call
 }
 }
 });
 
 setTimeout(function () { document.getElementById('wrapper').style.left = '0'; }, 800);
}

//初始化绑定iScroll控件 
document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);
document.addEventListener('DOMContentLoaded', loaded, false);

总结

主要还是要对iScroll做一些初始化的操作,针对不同的动作显示不同的提示信息,然后针对下拉和上拉事件写相应刷新和加载更多的处理方法即可。

Javascript 相关文章推荐
jquery 获取 outerHtml 包含当前节点本身的代码
Oct 30 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
Dec 04 Javascript
js获取新浪天气接口的实现代码
Jun 06 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
Jul 05 Javascript
JavaScript中动态向表格添加数据
Jan 24 Javascript
vue2使用keep-alive缓存多层列表页的方法
Sep 21 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 Javascript
从0到1搭建Element的后台框架的方法步骤
Apr 10 Javascript
微信小程序template模版的使用方法
Apr 13 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
微信小程序以ssm做后台开发的实现示例
Apr 08 Javascript
JavaScript实现跟随鼠标移动的盒子
Jan 28 Javascript
jQuery插件pagination实现无刷新分页
May 21 #Javascript
JavaScript中对JSON对象的基本操作示例
May 21 #Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
May 21 #Javascript
jQuery EasyUI Pagination实现分页的常用方法
May 21 #Javascript
总结JavaScript设计模式编程中的享元模式使用
May 21 #Javascript
在JavaScript中模拟类(class)及类的继承关系
May 20 #Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
May 20 #Javascript
You might like
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
javascript表单正则应用
2017/02/04 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
python获取当前计算机cpu数量的方法
2015/04/18 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
最新的大学生找工作自我评价
2013/09/29 职场文书
小学生防溺水广播稿
2014/01/12 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
2014年电教工作总结
2014/12/19 职场文书
针对吵架老公保证书
2015/05/08 职场文书
汶川大地震感悟
2015/08/10 职场文书