基于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 相关文章推荐
新页面打开实际尺寸的图片
Aug 25 Javascript
客户端js性能优化小技巧整理
Nov 05 Javascript
使图片旋转的3种解决方案
Nov 21 Javascript
js 限制input只能输入数字、字母和汉字等等
Dec 18 Javascript
JavaScript中的console.log()函数详细介绍
Dec 29 Javascript
jQuery网页选项卡插件rTabs用法实例分析
Aug 26 Javascript
浅谈jQuery中ajaxPrefilter的应用
Aug 01 Javascript
js实现消息滚动效果
Jan 18 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
Aug 17 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
微信小程序使用modal组件弹出对话框功能示例
Nov 29 Javascript
讲解vue-router之什么是嵌套路由
May 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 Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
JSON 必知必会 观后记
2016/10/27 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
Python学习资料
2007/02/08 Python
python开发之list操作实例分析
2016/02/22 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
Python实现仿射密码的思路详解
2020/04/23 Python
python的launcher用法知识点总结
2020/08/07 Python
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
模具数控专业自荐信
2014/01/27 职场文书
运动会口号大全
2014/06/07 职场文书
学校个人对照检查材料
2014/08/26 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
劳模先进事迹材料
2014/12/24 职场文书
降价通知函
2015/04/23 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
中国合伙人观后感
2015/06/02 职场文书
2016年中秋节寄语大全
2015/12/07 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
python playwrigh框架入门安装使用
2022/07/23 Python