scroll事件实现监控滚动条并分页显示(zepto.js)


Posted in Javascript onDecember 18, 2016

需求:在APP落地页上的底部位置显示此前其他用户的购买记录,要求此div盒子只显示3条半,但一页有10条,div内的滑动条滑到一页底部自动加载下一页并发加载埋点。

实现:首先理解三个概念,分别是contentH,viewH,scrollTop。

contentH:即所要滑动的元素内容的高度,包括可见部分以及滚动条下面的不可见部分。

ViewH:即我们看到的这个DIV的高度,不包括可见部分也不包括滚动条下面的不可见部分。

scrollTop:即滚动条距离顶部的距离,若scrollTop的值为0,则代表滚动条在最上面。拉动滚动条,从最上面到最下面,变化的是scrollTop的值。例:假如contentH的高度为2000,而这个DIV的高度只有300,那么还有1700不可见,拉动滚动条到最底部,此时scrollTop为1700,所以这个1700也可以理解为滚动条可以滚动的长度。当滑动条拉到底部的时候,contentH=viewH+scrollTop。

故可实现如下:

$.ajax({
  type: "get",
  url: "record.json",//测试用假数据
  dataType: "json",
  success: function (records) {
    var showLength = records.data.length;//需要显示的总长度
    var flag = showLength <= 10 ? showLength : 10;
    load_records(0, flag);//开始加载第一页
    hxmClickStat('mar_all_207_ssjk.goumai.load.' + 1, {url_ver: "SJCGBS-10030"});//不论长度是否超过10都发送第一页埋点
    if (showLength > 10) {
      var origin = 1, load = 2;
      $('.records_body').scroll(function () {
        var contentH = $(this).get(0).scrollHeight;
        var viewH = $('.records_body').height();
        var scrollTop = $(this).scrollTop();
        var pages = Math.ceil(showLength / 10);//需要显示的总页数
        if (viewH + scrollTop == contentH && load <= pages) {
          if (load * 10 < showLength) {
            load_records(origin++ * 10, load++ * 10);//加载下一页的10条数据
            hxmClickStat('mar_all_207_ssjk.goumai.load.' + origin, {url_ver: "SJCGBS-10030"});//滑动到底部开始加载下一页时发送埋点
          } else {
            load_records(origin * 10, showLength);//加载最后一页
            hxmScrollBottomStat('mar_all_207_ssjk.goumai.bottom', {url_ver: "SJCGBS-10030"});//最后一页发送埋点
            load++;//避免重复执行
          }
        }
      });
    }
    function load_records(start, end) {
      for (var i = start; i < end; i++) {
        var stime = records.data[i].time;
        var accure_time = stime.slice(5, stime.length);
        var record_html = '<div class="records_item"><img src=' + records.data[i].avatar + ' class="avatar"/><div class="buyer_info"><p class="buyer_name">' + records.data[i].account + '</p><p class="status_title">购买成功</p></div>\n\<' +
          'div class="buyer_address"><p class="buy_address">' + records.data[i].city + ' IP:' + records.data[i].ip + '</p>\n\<' +
          'p class="buy_time">' + accure_time + '</p></div></div>';
        $(record_html).appendTo('.records_body');//插入一条购买记录
      }
    }
  },
  error: function () {
    console.log('some errors happened!');
  }
});

以上方法在苹果手机浏览器中会达不到预期效果,解决方法及代码改进

将触底判断条件更改为

if (viewH + scrollTop +1>= contentH && load <= pages)

究其原因,故在滚动时将scrollTop和viewH、contentH分别打印出来,滑到底部的时候发现他们有1个单位的误差,可能是因为某些div元素的高度不为整数而js在判断的时候直接将其取整了,故可以选择将其加1。

也可以使用另一种方式百分比的判断条件来实现:在滚动条距离底端2%以内:scrollTop / (contentH? viewH) >= 0.98

或者使用绝对数值范围来实现,滚动条距离底端30px以内:contentH ? viewH ? scrollTop <= 30

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于JavaScript的一些看法
May 27 Javascript
javascript写的一个模拟阅读小说的程序
Apr 04 Javascript
JQuery中Bind()事件用法分析
May 05 Javascript
简单讲解AngularJS的Routing路由的定义与使用
Mar 05 Javascript
完美JQuery图片切换效果的简单实现
Jul 21 Javascript
js导出excel文件的简洁方法(推荐)
Nov 02 Javascript
js闭包用法实例详解
Dec 13 Javascript
jQuery中的on与bind绑定事件区别实例详解
Feb 28 Javascript
js实现登录与注册界面
Nov 01 Javascript
vue实现tab切换外加样式切换方法
Mar 16 Javascript
js中Array对象的常用遍历方法详解
Jan 17 Javascript
element ui分页多选,翻页记忆的实例
Sep 03 Javascript
简单实现node.js图片上传
Dec 18 #Javascript
Javascript计算二维数组重复值示例代码
Dec 18 #Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
Dec 18 #Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 #Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
Dec 18 #Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
Dec 18 #Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 #Javascript
You might like
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
javascript读写json示例
2014/04/11 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
详解Python中的正则表达式的用法
2015/04/09 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
详解Python3中yield生成器的用法
2015/08/20 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
用python计算文件的MD5值
2020/12/23 Python
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
德国户外商店:eXXpozed
2020/07/25 全球购物
放飞中国梦演讲稿
2014/04/23 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
社区助残日活动总结
2014/08/29 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
争先创优个人总结
2015/03/04 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
认识实习感想
2015/08/10 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫