如何使用JQuery实现弹窗、AJAX分页加载TAB分类数据并解决数据混杂问题?

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分类数据并解决数据混杂问题?

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享