基于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 相关文章推荐
JS无法捕获滚动条上的mouse up事件的原因猜想
Mar 21 Javascript
原生javascript实现简单的datagrid数据表格
Jan 02 Javascript
javascript实现动态统计图开发实例
Nov 21 Javascript
通过JS获取Request.QueryString()参数的值实现方法
Sep 27 Javascript
ES6模块化的import和export用法方法总结
Aug 08 Javascript
Node调用Java的示例代码
Sep 20 Javascript
微信小程序实现添加手机联系人功能示例
Nov 30 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
Aug 03 Javascript
JavaScript中变量、指针和引用功能与操作示例
Aug 04 Javascript
Node.js API详解之 console模块用法详解
May 12 Javascript
详解如何使用React Hooks请求数据并渲染
Oct 18 Javascript
Vue组件更新数据v-model不生效的解决
Apr 02 Vue.js
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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
php jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
php中实现记住密码自动登录的代码
2011/03/02 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
php实现微信公众号无限群发
2015/10/11 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
js操作select控件的几种方法
2010/06/02 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
详解vue v-model
2020/08/31 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
跟老齐学Python之开始真正编程
2014/09/12 Python
python实现在目录中查找指定文件的方法
2014/11/11 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
Python3模拟登录操作实例分析
2019/03/12 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
浅析Python中字符串的intern机制
2020/10/03 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
python 数据类型强制转换的总结
2021/01/25 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
2016年小学教师政治学习心得体会
2016/01/23 职场文书
python 字典和列表嵌套用法详解
2021/06/29 Python
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技