iscroll.js的上拉下拉刷新时无法回弹的解决方法


Posted in Javascript onFebruary 18, 2016

使用过iscroll.js的上拉下拉刷新效果的朋友应该都碰到过这个问题:在iOS的浏览器中,上拉或下拉刷新时,当手指划出屏幕后,页面无法弹回。很多人因为解决不了这个问题,干脆就那样不解决了,还有的直接就不用HTML了,使用原生代替HTML页面。

相信很多朋友也有自己的解决办法,只是没写出来,所以网上都搜不到解决方案。在很多QQ群里面也有很多人在问该怎么解决这个问题,所以我写这篇文章记录一下我的解决方案,希望对一些朋友有所帮助。

上拉下拉刷新的主要代码:

myScroll = new iScroll('wrapper', {
  vScrollbar: false,
  useTransition: true,
  topOffset: pullDownOffset,
  onRefresh: function () {
   if (pullDownEl.className.match('loading')) {
    pullDownEl.className = '';
    pullDownEl.querySelector('.pullDownLabel').innerHTML = 'Pull down to refresh...';
   } else if (pullUpEl.className.match('loading')) {
    pullUpEl.className = '';
    pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Pull up to load more...';
   }
  },
  onScrollMove: function () {
   if (this.y > 5 && !pullDownEl.className.match('flip')) {
    pullDownEl.className = 'flip';
    pullDownEl.querySelector('.pullDownLabel').innerHTML = 'Release to refresh...';
    this.minScrollY = 0;
   } else if (this.y < 5 && pullDownEl.className.match('flip')) {
    pullDownEl.className = '';
    pullDownEl.querySelector('.pullDownLabel').innerHTML = 'Pull down to refresh...';
    this.minScrollY = -pullDownOffset;
   } else if (this.y < (this.maxScrollY - 5) && !pullUpEl.className.match('flip')) {
    pullUpEl.className = 'flip';
    pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Release to refresh...';
    this.maxScrollY = this.maxScrollY;
   } else if (this.y > (this.maxScrollY + 5) && pullUpEl.className.match('flip')) {
    pullUpEl.className = '';
    pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Pull up to load more...';
    this.maxScrollY = pullUpOffset;
   }
  },
  onScrollEnd: function () {
   if (pullDownEl.className.match('flip')) {
    pullDownEl.className = 'loading';
    pullDownEl.querySelector('.pullDownLabel').innerHTML = 'Loading...';
    pullDownAction();
   } else if (pullUpEl.className.match('flip')) {
    pullUpEl.className = 'loading';
    pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Loading...';
    pullUpAction();
   }
  }
 });

页面无法弹回的原因在于:手指划出屏幕后touchend事件无法触发,回弹动画就无法执行。解决办法就是:当手指接近屏幕边缘的时候,手动触发动画方法。

在onScrollMove方法中插入判断代码:

onScrollMove: function () {
   if((this.y < this.maxScrollY) && (this.pointY < 1)){
    this.scrollTo(0, this.maxScrollY, 400);
    return;
   } else if (this.y > 0 && (this.pointY > window.innerHeight - 1)) {
    this.scrollTo(0, 0, 400);
    return;
   }

   ......
  }

下面解释一下这段代码的意思。

this.y是页面已经滚动的垂直距离,this.maxScrollY是最大垂直滚动距离,this.pointY手指当前的垂直坐标。

当this.y < this.maxScrollY,就是已经处于上拉的过程,当(this.y < this.maxScrollY) && (this.pointY < 1)时,处于上拉且手指已经触及屏幕边缘,这时候手动触发this.scrollTo(0, this.maxScrollY, 400),页面就开始回弹。

下拉过程也可以同理分析。

Javascript 相关文章推荐
jquery 简单导航实现代码
Sep 11 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
May 23 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
Jan 13 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
jQuery日历插件datepicker用法详解
Mar 03 Javascript
购物车前端开发(jQuery和bootstrap3)
Aug 27 Javascript
详解webpack 多入口配置
Jun 16 Javascript
示例vue 的keep-alive缓存功能的实现
Dec 13 Javascript
JavaScript数组特性与实践应用深入详解
Dec 30 Javascript
element-ui如何防止重复提交的方法步骤
Dec 09 Javascript
微信小程序swiper实现文字纵向轮播提示效果
Jan 21 Javascript
javascript每日必学之条件分支
Feb 17 #Javascript
JavaScipt中栈的实现方法
Feb 17 #Javascript
Bootstrap入门书籍之(五)导航条、分页导航
Feb 17 #Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
Feb 17 #Javascript
Bootstrap入门书籍之(三)栅格系统
Feb 17 #Javascript
Bootstrap入门书籍之(一)排版
Feb 17 #Javascript
Bootstrap入门书籍之(零)Bootstrap简介
Feb 17 #Javascript
You might like
php使用正则验证中文
2016/04/06 PHP
利用Laravel事件系统如何实现登录日志的记录详解
2017/05/20 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
Js基础学习资料
2010/11/23 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
使用Kivy将python程序打包为apk文件
2017/07/29 Python
python实现k-means聚类算法
2018/02/23 Python
Python基础之文件读取的讲解
2019/02/16 Python
python opencv调用笔记本摄像头
2019/08/28 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
进修护士自我鉴定
2013/10/14 职场文书
回门宴答谢词
2014/01/13 职场文书
服装店营销方案
2014/03/10 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
培训心得体会怎么写
2016/01/25 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
AngularJS实现多级下拉框
2022/03/25 Javascript