jquery弹窗及ajax分页加载tab分类数据详解
本文将详细讲解如何使用JQuery实现点击按钮弹窗,并通过AJAX加载对应TAB分类ID的数据,同时在每个TAB滚动到底部时自动加载下一页数据的功能。 问题中提供的代码存在一个关键缺陷:每次点击TAB时,没有清除之前的加载数据,导致不同TAB的内容混杂在一起。 以下将对代码进行改进,并说明实现细节。
首先,我们需要理解问题的核心在于如何正确地管理每个TAB对应的AJAX请求和数据。原始代码的问题在于loadCategoryData函数中,滚动事件监听器始终作用于同一个.tab_item元素,导致不同分类的数据互相干扰。 解决方法是为每个TAB的数据加载过程设置独立的变量和状态管理。
改进后的代码如下,这里用模拟数据代替了实际的AJAX请求,方便理解和测试:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.tab_p {
display: flex;
}
.tab_item {
height: 300px;
overflow: auto;
}
.tab_item img {
height: 50px;
object-fit: cover;
}
</style>
</head>
<body>
<div class="btn">点击我弹窗并加载分类1数据</div>
<div class="tab_p">
<p data-id="1">分类1</p>
<p data-id="2">分类2</p>
<p data-id="3">分类3</p>
</div>
<div class="tab_content">
<div class="tab_item">
<!--分类内容加载区-->
</div>
</div>
</body>
<script src="./jquery.min.js"></script>
<script>
// 不需要总页数,因为总页数是后端返回的,前端不需要知道总页数,只需要知道当前页码即可
// 初始化分类ID currentPage total
let categoryId = 1, currentPage = 1, total = 0;
// 是否加载中
let isLoading = false;
$(document).on('click', '.btn', function () {
loadCategoryData(categoryId, currentPage);
})
$('.tab_p p').click(function () {
currentPage = 1;
categoryId = $(this).data('id');
// 加载对应分类的数据
loadCategoryData(categoryId, currentPage);
})
function loadCategoryData(id, page) {
$(".tab_item").html('加载中...');
$(this).addClass('cur').siblings().removeClass('cur');
loadPageData(id, page);
}
// 监听滚动事件
$('.tab_item').scroll(function () {
console.log('scroll...', $('.tab_item').scrollTop(), $('.tab_item').innerHeight())
if (isLoading) {
return;
}
// 判断是否滚动到底部距离150px 加载更多
const scrollTop = $(this).scrollTop();
const scrollHeight = $(this).prop('scrollHeight');
const containerHeight = $(this).outerHeight();
if (scrollHeight - scrollTop - containerHeight < 150) {
// 滚动到底部距离小于150px,加载更多数据
currentPage++;
if (currentPage <= total) {
loadPageData(categoryId, currentPage);
}
}
});
// 模拟个函数,用于加载某一页的数据
function getData(categoryId, page) {
console.log('getData...', categoryId, page)
return new Promise((resolve, reject) => {
setTimeout(() => {
// 随机返回page条数据
const list = [];
// 每次返回20条数据
for (var i = 0; i < 20; i++) {
list.push({
title: '分类:' + categoryId + ',标题:' + i,
img_url: 'https://picsum.photos/200/300?random=' + i
});
}
resolve({
list, // 当前页的数据
page, // 当前页码
totalPages: 100 // 后端返回的总页数
});
}, 1000);
});
}
function loadPageData(categoryId, page) {
// 判断是否正在加载中
if (isLoading) {
return;
}
isLoading = true;
getData(categoryId, page).then(({ list, page, totalPages }) => {
// 更新总页数
total = totalPages;
let html = "";
for (var i = 0; i < list.length; i++) {
html += '<div>@@##@@<span>"' + list[i].title + '"</span></div>';
}
$(".tab_item").append(html);
}).finally(() => {
isLoading = false;
});
}
</script>
</html>
这段代码通过isLoading变量避免了重复请求,并使用Promise处理异步操作,保证数据加载的顺序性和正确性。 同时,通过在滚动事件中判断距离底部距离来触发加载下一页,提高用户体验。 需要注意的是,实际应用中,/ajax.php?mod=tab接口需要根据实际情况进行替换。 并且,应该在后端返回的数据中包含总页数信息,以便前端能够准确判断是否需要加载下一页数据。
以上就是如何使用JQuery实现弹窗、AJAX分页加载TAB分类数据并解决数据混杂问题?的详细内容,更多请关注知识资源分享宝库其它相关文章!
版权声明
本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com
发表评论