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 相关文章推荐
通过复制Table生成word和excel的javascript代码
Jan 20 Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
Dec 15 Javascript
javascript实现拖放效果
Dec 16 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
微信小程序 开发指南详解
Sep 27 Javascript
vue form check 表单验证的实现代码
Dec 09 Javascript
配置eslint规范项目代码风格
Mar 11 Javascript
Vue关于组件化开发知识点详解
May 13 Javascript
JS变量提升原理与用法实例浅析
May 22 Javascript
javascript实现移动端轮播图
Dec 09 Javascript
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
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
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
php include类文件超时问题处理
2015/02/06 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
js获取单选按钮的数据
2006/11/27 Javascript
JavaScript继承方式实例
2010/10/29 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
Python验证企业工商注册码
2015/10/25 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
python3.6数独问题的解决
2019/01/21 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Python读取YAML文件过程详解
2019/12/30 Python
Python turtle库的画笔控制说明
2020/06/28 Python
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
写一个方法1000的阶乘
2012/11/21 面试题
警校毕业生自我评价
2014/04/06 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
导游词之山东孔庙
2019/11/04 职场文书