H5基于iScroll实现下拉刷新和上拉加载更多


Posted in Javascript onJuly 18, 2017

前言

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

使用技巧

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

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

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

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

效果图

 H5基于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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
摘自百度的图片轮换效果代码
Nov 19 Javascript
Prototype Template对象 学习
Jul 19 Javascript
简单实现js页面切换功能
Jan 10 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
Sep 22 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
Jan 03 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
Mar 09 Javascript
vue mounted组件的使用
Jun 18 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
Sep 27 Javascript
JavaScript命名空间模式实例详解
Jun 20 Javascript
JS使用正则表达式提交页面验证的代码
Oct 16 Javascript
vue打开子组件弹窗都刷新功能的实现
Sep 21 Javascript
如何手动实现一个 JavaScript 模块执行器
Oct 16 Javascript
iscroll动态加载数据完美解决方法
Jul 18 #Javascript
Angular4学习笔记之新建项目的方法
Jul 18 #Javascript
详解使用nvm安装node.js
Jul 18 #Javascript
jQuery之动画ajax事件(实例讲解)
Jul 18 #jQuery
js判断用户是输入的地址请求的路径(实例讲解)
Jul 18 #Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 #Javascript
angular使用bootstrap方法手动启动的实例代码
Jul 18 #Javascript
You might like
php下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
jQuery 1.0.2
2006/10/11 Javascript
jQuery 浮动广告实现代码
2008/12/25 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
python通过线程实现定时器timer的方法
2015/03/16 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
快速了解Python相对导入
2018/01/12 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
Python检查ping终端的方法
2019/01/26 Python
python里 super类的工作原理详解
2019/06/19 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
CSS3不透明度实例讲解
2016/04/26 HTML / CSS
Super-Pharm波兰:药房和香水在一个地方
2020/08/18 全球购物
万里长城导游词
2015/01/30 职场文书
公司更名通知函
2015/04/24 职场文书
特种设备安全管理制度
2015/08/06 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js