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

发布时间 - 2026-01-11 02:23:24    点击率:

前言

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

使用技巧

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

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

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

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

效果图

 

实现方法

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);

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


# H5  # iScroll  # 下拉刷新  # 上拉加载  # 基于iscroll.js实现下拉刷新和上拉加载效果  # 基于HTML5上使用iScroll实现下拉刷新  # 上拉加载更多  # IScroll5实现下拉刷新上拉加载的功能实例  # 加载  # 完成后  # 自定义  # 自己的  # 加载中  # 有个  # 在这个  # 分页  # 刚开始  # 时就  # 脑海里  # 绑定  # 最关键  # 翻页  # 使用技巧  # 大家多多  # 前一段  # 时需  # 事后  # 这时候 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 闭包写法详细介绍  Laravel如何实现本地化和多语言支持?(i18n教程)  如何注册花生壳免费域名并搭建个人网站?  详解jQuery中基本的动画方法  UC浏览器如何设置启动页 UC浏览器启动页设置方法  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  JS实现鼠标移上去显示图片或微信二维码  Laravel用户密码怎么加密_Laravel Hash门面使用教程  QQ浏览器网页版登录入口 个人中心在线进入  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何在腾讯云免费申请建站?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  phpredis提高消息队列的实时性方法(推荐)  网易LOFTER官网链接 老福特网页版登录地址  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何在阿里云通过域名搭建网站?  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  如何用西部建站助手快速创建专业网站?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  ,在苏州找工作,上哪个网站比较好?  如何彻底卸载建站之星软件?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  油猴 教程,油猴搜脚本为什么会网页无法显示?  js代码实现下拉菜单【推荐】  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  晋江文学城电脑版官网 晋江文学城网页版直接进入  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  ,怎么在广州志愿者网站注册?  Python文件异常处理策略_健壮性说明【指导】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Android实现代码画虚线边框背景效果  Laravel怎么实现验证码(Captcha)功能  高防服务器租用如何选择配置与防御等级?  如何快速完成中国万网建站详细流程?  免费视频制作网站,更新又快又好的免费电影网站?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  黑客入侵网站服务器的常见手法有哪些?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  高性价比服务器租赁——企业级配置与24小时运维服务