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 相关文章推荐
JS查看对象功能代码
Apr 25 Javascript
EXT中xtype的含义分析
Jan 07 Javascript
细说浏览器特性检测(2)-通用事件检测
Nov 05 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
Mar 18 Javascript
jquery trigger实现联动的方法
Feb 29 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
Oct 09 Javascript
js实现手机发送验证码功能
Mar 13 Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
Apr 12 jQuery
express.js中间件说明详解
Mar 19 Javascript
js实现移动端图片滑块验证功能
Sep 29 Javascript
Javascript 解构赋值详情
Nov 17 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函数(简单整理)
2010/04/30 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
PHP简单日历实现方法
2016/07/20 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
让焦点自动跳转
2006/07/01 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
js获取form的方法
2015/05/06 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
js module大战
2019/04/19 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
vue弹出框组件封装实例代码
2019/10/31 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
ASP.NET Core中的配置详解
2021/02/05 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
什么是servlet
2012/05/08 面试题
党课培训主持词
2014/04/01 职场文书
个人创业事迹材料
2014/12/30 职场文书
化验员岗位职责
2015/02/14 职场文书
英语通知范文
2015/04/22 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python