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 相关文章推荐
mapper--图片热点区域高亮组件官方站点
Dec 22 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
Jan 04 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
不同js异步函数同步的实现方法
May 28 Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 Javascript
微信小程序开发经验总结(推荐)
Jan 11 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
Sep 13 Javascript
微信小程序实现搜索指定景点周边美食、酒店
May 18 Javascript
js最全的数组的降维5种办法(小结)
Apr 28 Javascript
JavaScript中数组去重的5种方法
Jul 04 Javascript
JavaScript获取时区实现过程解析
Sep 24 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
PHP JSON 数据解析代码
2010/05/26 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
Python二元赋值实用技巧解析
2019/10/25 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
祖国在我心中演讲稿500字
2014/05/04 职场文书
迎国庆演讲稿
2014/09/05 职场文书
同事离别感言
2015/08/04 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers