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将数据库中的TEXT类型数据动态赋值到TEXTAREA中
Apr 20 Javascript
用Javascript数组处理多个字符串的连接问题
Aug 20 Javascript
AngularJS模块学习之Anchor Scroll
Jan 19 Javascript
使用vue.js制作分页组件
Jun 27 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
Sep 02 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
DOM 事件的深入浅出(二)
Dec 05 Javascript
详解vue-cli 构建Vue项目遇到的坑
Aug 30 Javascript
vue 2.0项目中如何引入element-ui详解
Sep 06 Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 Javascript
微信小程序将字符串生成二维码图片的操作方法
Jul 17 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 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 cookies中删除的一般赋值方法
2011/05/07 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
非常实用的php验证码类
2016/05/15 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
javascript 类方法定义还是有点区别
2009/04/15 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
小程序实现列表倒计时功能
2021/01/29 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Django基础知识 URL路由系统详解
2019/07/18 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python如何批量生成和调用变量
2020/11/21 Python
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
应届护士推荐信
2013/11/16 职场文书
争论的故事教学反思
2014/02/06 职场文书
品德评语大全
2014/05/05 职场文书
医院合作协议书
2014/08/19 职场文书
消防演习感想
2015/08/10 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
Vue+Flask实现图片传输功能
2022/04/01 Vue.js