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 相关文章推荐
jquery中的$(document).ready()与window.onload的区别
Nov 18 Javascript
JavaScript 学习笔记(六)
Dec 31 Javascript
无闪烁更新网页内容JS实现
Dec 19 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
Aug 31 Javascript
node.js 中国天气预报 简单实现
Jun 06 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
Dec 18 Javascript
elementUI table表格动态合并的示例代码
May 15 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
Jul 13 Javascript
使用vuex存储用户信息到localStorage的实例
Nov 11 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
Apr 28 Javascript
vue-cli3 引入 font-awesome的操作
Aug 11 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数字游戏 计算24算法
2012/06/10 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
品质管理部岗位职责范文
2014/03/01 职场文书
毕业生应聘求职信
2014/07/10 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
创新社会管理心得体会
2014/09/12 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
运动会致辞稿
2015/07/29 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
演讲开头怎么书写?
2019/08/06 职场文书