美文网首页
H5滑动到底部自动加载数据

H5滑动到底部自动加载数据

作者: zdmission | 来源:发表于2019-12-09 15:03 被阅读0次

    摘要

    滑动页面到底,自动加载数据算是一个很常用的功能,减少用户操作,增加用户体验,让用户很顺畅的查看数据,但是浏览器厂商太多,有些方法和属性不兼容,得到的值也是大不相同。

    问题描述

    手机型号红米note7自带浏览器中,document.documentElement.scrollTop的值是小数,document.body.scrollTop值为0,而在微信浏览器中document.body.scrollTop有值并且为整数,document.documentElement.scrollTop值为0,各大浏览器对于数据的处理不一样,导致最后判断触底\color{red}{(文档滚动高度 == 可是窗口高度 + scrollTop值)}这个等式不成立,不触发加载数据的条件,其次应该要做小范围的容错处理,在某个范围内成立就行

    解决方案

    按照这个公式\color{red}{(文档滚动高度 == 可是窗口高度 + scrollTop值)}计算各部分的值

    // 节流函数
    function throttle(func, wait, mustRun) {
      let timeout,
        startTime = new Date();
    
      return function() {
        let context = this,
          args = arguments,
          curTime = new Date();
        clearTimeout(timeout);
        // 如果达到了规定的触发时间间隔,触发 handler
        if (curTime - startTime >= mustRun) {
          func.apply(context, args);
          startTime = curTime;
          // 没达到触发间隔,重新设定定时器
        } else {
          timeout = setTimeout(func, wait);
        }
      };
    }
    
    // 可滚动高度
    let scrollHeight = () =>
      document.body.scrollHeight || document.documentElement.scrollHeight;
    // 可视窗口高度
    let keshiHeight = () =>
      window.innerHeight ||
      document.documentElement.clientHeight ||
      document.body.clientHeight;
    
    // 注:小米浏览器对于scrollTop的值会有小数,需要做取整操作
    // 向上滚动的高度,各大浏览器的计算法则不一样,得到的值可能有小数
    let scrollTopHeight = () =>
      Math.ceil(document.body.scrollTop || document.documentElement.scrollTop);
    
    window.onscroll = throttle(
      () => {
        // 增加容错范围, 提前触发加载
        if (scrollHeight() - 50 <= keshiHeight() + scrollTopHeight()) {
          // 业务逻辑操作,对号入座
          if (!this.noMore) {
            console.log("bottom");
            this.pageNo++;
            this.getDataFn();
          }
        }
      },
      300,
      300
    );
    

    相关文章

      网友评论

          本文标题:H5滑动到底部自动加载数据

          本文链接:https://www.haomeiwen.com/subject/mubbgctx.html