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的deferred对象使用详解
Aug 20 Javascript
js/html光标定位的实现代码
Sep 23 Javascript
Jquery对数组的操作技巧整理
Mar 25 Javascript
Javascript连接Access数据库完整实例
Aug 03 Javascript
js 定义对象数组(结合)多维数组方法
Jul 27 Javascript
javascript 开发之网页兼容各种浏览器
Sep 28 Javascript
详解vue-cli 接口代理配置
Dec 13 Javascript
Vue-Router模式和钩子的用法
Feb 28 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 Javascript
VueCli3构建TS项目的方法步骤
Nov 07 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
May 21 Javascript
解决vue-router 二级导航默认选中某一选项的问题
Nov 01 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/16 PHP
用穿越火线快速入门php面向对象
2012/02/22 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
php事件驱动化设计详解
2016/11/10 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
js null undefined 空区别说明
2010/06/13 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
简单理解Python中的装饰器
2015/07/31 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
Python子类继承父类构造函数详解
2019/02/19 Python
python的sorted用法详解
2019/06/25 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
幸福家庭事迹材料
2014/02/03 职场文书
高中开学感言
2015/08/01 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
vue使用watch监听属性变化
2022/04/30 Vue.js