JS实现页面滑到底部加载下一页数据
事情的起因是这样的...
今天,同学在群里请教老师问题,见老师没有回复,热心肠
的我就替老师回答了一下,结果
最后这个艰巨的
任务就落在了我的头上。
开始
先搭建个h5页面,写几行html和css代码
<div id="main">
<div id="content">
<ul id="ul">
</ul>
</div>
</div>
body {
background-color: #eee;
}
#main {
margin: 0 auto;
width: 600px;
}
#content {
position: absolute;
width: 600px;
}
#ul {
margin: 0;
padding: 0;
}
#ul li {
list-style-type: none;
background-color: #2AC2D1;
margin: 0;
margin-top: 30px;
border-radius: 10px;
text-align: center;
height: 60px;
color: #fff;
}
下面开始写js功能部分的代码
这位同学的需求大概就是页面滑到底部时,加载一页数据,也就是分页的功能。这个功能的要点就是判断页面什么时候到了底部
,需要加载数据先写个模拟接口请求数据的方法
// 模拟请求接口返回数据的方法
function mockApi(pagenum, pagesize) {
return new Promise(function(resolve, reject) {
let data = [];
for (let i = 0; i < pagesize; i++) {
data.push(`第${pagenum}页的数据--${i + 1}`);
}
resolve(data);
})
}
请求方法返回数据之后需要将数据渲染到页面中
// 渲染dom的方法
function render(){
mockApi(pagenum, pagesize).then(function(res) {
for (let item of res) {
let dom = document.createElement("li");
dom.innerHTML = item;
ul.appendChild(dom);
}
})
}
然后设置一些初始数据,页面加载执行第一次渲染
var pagenum = 1; // 页数
var pagesize = 20; // 每页多少条
const ul = document.getElementById("ul");
window.onload = function() {
render(); // 页面加载完成渲染一次
}
这一步结束,可以看到是下面这样,滑到底部还是没有反应的,因为还没写功能代码
最后,也是这个功能的要点,让页面滑到底部的时候可以加载一页数据。通过window.onscroll
事件监听页面的滚动,在事件监听的方法中判断如果滚动条距离顶部的距离
+ 页面可视窗口的高度
> 网页总高度
的时候,此时页面就到了最底部。代码如下:
window.onscroll = function() {
//获取网页的总高度
var htmlHeight = document.body.scrollHeight || document.documentElement.scrollHeight;
//clientHeight是网页在浏览器中的可视高度
var clientHeight = document.body.clientHeight || document.documentElement.clientHeight;
//scrollTop是浏览器滚动条的top位置
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
//判断到底部了,为了避免一些问题,设置距离底部50px时就执行代码
console.log(scrollTop + clientHeight, htmlHeight);
if (scrollTop + clientHeight > htmlHeight - 50) {
pagenum++; // 页码+1
render();
}
}
预览效果如下:
优化一下
通过预览的效果可以看到onscroll
事件监听,执行的次数多很频繁,这样会影响性能,所以改写一下事件监听,添加一个防抖函数
。
把事件监听函数提取出来:
function scrollFn(){
//获取网页的总高度
var htmlHeight = document.body.scrollHeight || document.documentElement.scrollHeight;
//clientHeight是网页在浏览器中的可视高度
var clientHeight = document.body.clientHeight || document.documentElement.clientHeight;
//scrollTop是浏览器滚动条的top位置
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
//判断到底部了
console.log(scrollTop + clientHeight , htmlHeight)
if (scrollTop + clientHeight > htmlHeight - 50) {
pagenum++; // 页码+1
render();
}
}
写一个防抖函数
function debounce(fn, delay){
let timeout;
return function() {
clearTimeout(timeout);
timeout = setTimeout(()=>{
fn.apply(this, arguments);
},delay)
}
}
重新设置监听:
window.onscroll = debounce(scrollFn, 200);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2021-01-26 Visual Studio 2017离线安装包,百度云分流
2021-01-26 vpn工作原理和搭建方法
2021-01-26 Nuget很慢,我们该怎么办
2016-01-26 (转)INSTALLSHIELD 2010 预安装组件和软件
2016-01-26 InstallShield高级应用--检查是否安装ORACLE或SQL Server