jQuery实现当拉动滚动条到底部加载数据的方法分析


Posted in jQuery onJanuary 24, 2019

本文实例讲述了jQuery实现当拉动滚动条到底部加载数据的方法。分享给大家供大家参考,具体如下:

滚动条到底部加载数据原理很简单,就是为window或者滚动元素添加一个scroll事件,浏览器每次触发scroll事件时判断是否滚动到了浏览器底部,

如果到了底部则加载新数据。关键是计算滚动条是否滚动到了浏览器底部,算法如下

滚动条卷起来的高度 + 窗口高度 > 文档的总高度 

$(window).on('scroll',function(){
  if(scrollTop() + windowHeight() >= (documentHeight() - 50/*滚动响应区域高度取50px*/)){
    loadMore();
  }
});

获取页面顶部被卷起来的高度函数

//获取页面顶部被卷起来的高度
function scrollTop(){
 return Math.max(
 //chrome
 document.body.scrollTop,
 //firefox/IE
 document.documentElement.scrollTop);
}

chrome浏览器和Firefox/IE对滚动条是属于body还是html理解不同导致处理不同。

获取页面文档的总高度

//获取页面文档的总高度
function documentHeight(){
 //现代浏览器(IE9+和其他浏览器)和IE8的document.body.scrollHeight和document.documentElement.scrollHeight都可以
 return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);
}

这个算法和jQuery计算文档高度的方法一致。

获取页面浏览器视口的高度

function windowHeight(){
 return (document.compatMode == "CSS1Compat")?
 document.documentElement.clientHeight:
 document.body.clientHeight;
}

这里需要说明的是document.compatMode这个东东。很陌生,一般情况貌似没有遇到过。

document.compatMode有两个取值"BackCompat"和"CSS1Compat"。官方解释是BackCompat:标准兼容模式关闭。

CSS1Compat:标准兼容模式开启。

IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,

但在Quirks Mode模式下则有很大差别,而在不声明Doctype的情况下,IE默认又是Quirks Mode。

举个例子说明两种模式之间的差别有多大。

  • 当document.compatMode等于"BackCompat"时,浏览器客户区宽度是document.body.clientWidth
  • 当document.compatMode等于CSS1Compat时,浏览器客户区宽度是document.documentElement.clientWidth

还有其他属性类似。这里不说了,但是我们可以预见两种模式导致IE渲染的基石都更改了,可想而知构建出来的建筑物差别当有多大。

所以请为每一个页面声明Doctype不仅仅是一个好习惯,而且是一个必要的处理。Quirks Mode可以进垃圾堆了。

当用户滚动元素中到一个不同的地方时,scroll事件将发送到这个元素。它适用于window对象,但也可滚动框架与CSS overflow属性设置为scroll的元素。

1、普通的div滚动到底部加载更多的方法

<div id="test">内容</div>
$('#test').scroll(function(event){
  var top = $(this).scrollTop();
  var height = $(this).height();
  var scrollHeight = $(this).get(0).scrollHeight;
  if(scrollHeight <= top+height){
    loadMore();
  }
});

结果实验发现#test的div怎么样也不能接受scroll时间,最后经过查找资料和测试,发现要给div加上overflow和height的属性。

#test{
  overflow:scroll;
  height:655px;
}

2、window滚动事件:

$(window).scroll(function () {
  var scrollTop = $(window).scrollTop();       // 滚动条距离顶部的高度
  //scrollHeight,windowHeight,scrollHeight1三个height相同,都是这个页面的高度
  var scrollHeight = $(document).height();     // 当前页面的总高度
  var windowHeight = $(window).height();      // 当前可视的页面高度,jquery获取的不是屏幕的高度,而是整个文档的高度
  var scrollHeight1 = $("#test").get(0).scrollHeight;
  var windowidth = $(window).width();
  var documentwidtht = $(document).width() ;
  var innerHeight = window.innerHeight; //window的高度,即手机的高度
  var clientHeight = document.body.clientHeight; //window的高度
  var clientHeight1 = document.documentElement.clientHeight;//这个是body的整个高度,chrom测试
  if(scrollTop + innerHeight >= scrollHeight){    // 距离顶部+当前高度 >=文档总高度,即代表滑动到底部
   loadMore();
  }
});

希望本文所述对大家jQuery程序设计有所帮助。

jQuery 相关文章推荐
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
Mar 21 jQuery
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
使用jQuery.Pin垂直滚动时固定导航
May 24 jQuery
jquery实现图片跟随鼠标的实例
Oct 17 jQuery
jquery中有哪些api jQuery主要API
Nov 20 jQuery
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
基于jquery实现左右上下移动效果
May 02 jQuery
jQuery实现网页拼图游戏
Apr 22 jQuery
jQuery实现轮播图效果demo
Jan 11 jQuery
JS+JQuery实现无缝连接轮播图
Dec 30 jQuery
jQuery实现鼠标拖动图片功能
Mar 04 jQuery
详解jQuery的核心函数和事件处理
Feb 18 jQuery
Jquery的Ajax技术使用方法
Jan 21 #jQuery
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 #jQuery
jquery获取file表单选择文件的路径、名字、大小、类型
Jan 18 #jQuery
jQuery实现适用于移动端的跑马灯抽奖特效示例
Jan 18 #jQuery
jQuery实现的3D版图片轮播示例【滑动轮播】
Jan 18 #jQuery
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
Jan 18 #jQuery
jquery的$().each和$.each的区别
Jan 18 #jQuery
You might like
PHP中的超全局变量
2006/10/09 PHP
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
PHP发送短信代码分享
2015/08/11 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
Python装饰器基础详解
2016/03/09 Python
详解Python中where()函数的用法
2018/03/27 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
基于python3生成标签云代码解析
2020/02/18 Python
python实时监控logstash日志代码
2020/04/27 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
python开发一款翻译工具
2020/10/10 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
早会开场白台词大全
2015/06/01 职场文书