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 call和apply区别及使用方法
Nov 14 Javascript
javascript中的事件代理初探
Mar 08 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
Apr 16 Javascript
浅析javascript中的DOM
Mar 01 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
Aug 24 Javascript
AngularJS equal比较对象实例详解
Sep 14 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
js清除浏览器缓存的几种方法
Mar 15 Javascript
jQuery实现鼠标经过显示动画边框特效
Mar 24 jQuery
深入浅析vue组件间事件传递
Dec 29 Javascript
Vue.js 图标选择组件实践详解
Dec 03 Javascript
js简单实现自动生成表格功能示例
Jun 02 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
Syphon 秘笈
2021/03/03 冲泡冲煮
PHP 和 MySQL 开发的 8 个技巧
2006/10/09 PHP
PHP重定向的3种方式
2013/03/07 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
jquery 使用简明教程
2014/03/05 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
js图片上传的封装代码
2017/08/01 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
聘任书的写作格式及范文
2014/03/29 职场文书
高三霸气励志标语
2014/06/24 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
普通党员对照检查材料
2014/08/28 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书