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 相关文章推荐
URI、URL和URN之间的区别与联系
Dec 20 Javascript
js兼容的placeholder属性详解
Aug 18 Javascript
Jquery 例外被抛出且未被接住原因介绍
Sep 04 Javascript
单击某一段文字改写文本颜色
Jun 06 Javascript
angularJS 中$scope方法使用指南
Feb 09 Javascript
jquery mobile开发常见问题分析
Jan 21 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
Jan 28 Javascript
详解Angular2响应式表单
Jun 14 Javascript
关于angularJs清除浏览器缓存的方法
Nov 28 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
Jul 24 Javascript
深入理解js A*寻路算法原理与具体实现过程
Dec 13 Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 jQuery
简单实现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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
jQuery常用选择器详解
2017/07/17 jQuery
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
Python自动连接ssh的方法
2015/03/07 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
Python requests上传文件实现步骤
2020/09/15 Python
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
《大海那边》教学反思
2014/04/09 职场文书
实习生岗位职责
2014/04/12 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
个人思想政治总结
2015/03/05 职场文书
MySQL创建表操作命令分享
2022/03/25 MySQL
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技