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 相关文章推荐
js图片预加载示例
Apr 30 Javascript
JavaScript面向对象程序设计教程
Mar 29 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
Aug 16 Javascript
Canvas 制作动态进度加载水球详解及实例代码
Dec 09 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
Zepto实现密码的隐藏/显示
Apr 07 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
Dec 28 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
Feb 01 Javascript
浅谈React中组件逻辑复用的那些事儿
May 21 Javascript
JavaScript实现图片放大预览效果
Nov 02 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 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中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
vue2实现数据请求显示loading图
2017/11/28 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
python有几个版本
2020/06/17 Python
python实现单机五子棋
2020/08/28 Python
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
什么是.net的Remoting技术
2016/07/08 面试题
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
维稳工作情况汇报
2014/10/27 职场文书
评职称个人总结
2015/03/05 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript