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 相关文章推荐
Javascript - HTML的request类
Jan 09 Javascript
来自qq的javascript面试题
Jul 24 Javascript
jquery对dom的操作常用方法整理
Jun 25 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
Dec 24 Javascript
jQuery模拟点击A标记示例参考
Apr 17 Javascript
javascript函数式编程程序员的工具集
Oct 11 Javascript
Jquery 垂直多级手风琴菜单附源码下载
Nov 17 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
Nov 22 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
详解vue中v-on事件监听指令的基本用法
Jul 22 Javascript
微信小程序自定义胶囊样式
Dec 27 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代码
2007/03/08 PHP
php strcmp使用说明
2010/04/22 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
为原生js Array增加each方法
2012/04/07 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python struct.unpack
2008/09/06 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
Python类的继承和多态代码详解
2017/12/27 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
高二历史教学反思
2014/01/25 职场文书
奥巴马连任演讲稿
2014/05/15 职场文书
小学网上祭英烈活动总结
2014/07/05 职场文书
骨干教师事迹材料
2014/12/17 职场文书
MySQL数据管理操作示例讲解
2022/12/24 MySQL