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 相关文章推荐
tagName的使用,留一笔
Jun 26 Javascript
JavaScript Event学习第五章 高级事件注册模型
Feb 07 Javascript
js读取csv文件并使用json显示出来
Jan 09 Javascript
JavaScript数组常用方法
Mar 02 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
Jan 20 Javascript
Require.js的基本用法详解
Jul 03 Javascript
js设置随机切换背景图片的简单实例
Nov 12 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
Dec 05 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
Jul 29 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
Nov 18 Javascript
详解JavaScript 高阶函数
Sep 14 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
PHP7新特性
2021/03/09 PHP
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
vue界面发送表情的实现代码
2020/09/11 Javascript
python网络爬虫采集联想词示例
2014/02/11 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
Python新手学习函数默认参数设置
2020/06/03 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
捷科时代的软件测试笔试题
2015/11/09 面试题
《火烧云》教学反思
2014/04/12 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
Go语言安装并操作redis的go-redis库
2022/04/14 Golang