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 相关文章推荐
setTimeout的延时为0时多个浏览器的区别
May 23 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
May 10 Javascript
JQUERY 设置SELECT选中项代码
Feb 07 Javascript
angular.element方法汇总
Jan 07 Javascript
简单介绍jsonp 使用小结
Jan 27 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
Apr 18 Javascript
表单中单选框添加选项和移除选项
Jul 04 Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
vue-cli3.0使用及部分配置详解
Aug 29 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
基于vue如何发布一个npm包的方法步骤
May 15 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脚本的10个技巧(3)
2006/10/09 PHP
php中处理模拟rewrite 效果
2006/12/09 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
2019/03/21 PHP
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
Python实现数据库编程方法详解
2015/06/09 Python
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python实现邮件发送功能
2019/08/10 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
python相对企业语言优势在哪
2020/06/12 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
laravel使用redis队列实例讲解
2021/03/23 PHP
出纳岗位职责
2015/01/31 职场文书
民事纠纷协议书
2016/03/23 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python