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中常见陷阱小结
Apr 27 Javascript
js异常捕获方法介绍
Apr 10 Javascript
基于JQuery实现的Select级联
Jan 27 Javascript
javascript获取当前的时间戳的方法汇总
Jul 26 Javascript
angularjs学习笔记之简单介绍
Sep 26 Javascript
深入php面向对象、模式与实践
Feb 16 Javascript
从0开始学Vue
Oct 27 Javascript
利用Node.js+Koa框架实现前后端交互的方法
Feb 27 Javascript
canvas压缩图片转换成base64格式输出文件流
Mar 09 Javascript
一次记住JavaScript的6个正则表达式方法
Feb 22 Javascript
Vue 组件封装 并使用 NPM 发布的教程
Sep 30 Javascript
微信小程序时间选择插件使用详解
Dec 28 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
html中select语句读取mysql表中内容
2006/10/09 PHP
discuz安全提问算法
2007/06/06 PHP
php5数字型字符串加解密代码
2008/04/24 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
php实现文件上传基本验证
2020/03/04 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
JavaScript 字符编码规则
2009/05/04 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
如何在python中实现线性回归
2020/08/10 Python
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
2014年大学生党课心得体会范文
2014/03/29 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
文明礼仪主题班会
2015/08/13 职场文书
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL