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 相关文章推荐
Json对象替换字符串占位符实现代码
Nov 17 Javascript
浅谈JavaScript编程语言的编码规范
Oct 21 Javascript
纯js简单日历实现代码
Oct 05 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
Sep 15 Javascript
jQuery制作简洁的多级联动Select下拉框
Dec 23 Javascript
jQuery侧边栏实现代码
May 06 Javascript
js仿小米官网图片轮播特效
Sep 29 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
Apr 13 Javascript
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 Javascript
JavaScript指定断点操作实例教程
Sep 18 Javascript
基于ajax及jQuery实现局部刷新过程解析
Sep 12 jQuery
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基于CURL进行POST数据上传实例
2014/11/10 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
2016/07/07 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
js css自定义分页效果
2017/02/24 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
幼儿园春游活动方案
2014/01/19 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
献爱心标语
2014/06/21 职场文书
工作收入证明模板
2014/10/10 职场文书
美容院合作经营协议书
2014/10/10 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
Python利用capstone实现反汇编
2022/04/06 Python
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python