JS实现页面数据无限加载

关于“JS实现页面数据无限加载”的攻略,我可以提供如下的详细讲解:

1. 实现原理

在页面滚动到底部的时候,通过监听滚动事件,判断当前滚动的位置是否达到了页面底部,在满足条件的情况下,通过AJAX技术异步向后端请求数据,再将数据呈现在页面上,实现数据的无限加载。

2. 实现步骤

2.1 监听页面滚动事件

首先,需要监听页面的滚动事件,可以通过以下代码实现:

window.onscroll = function() {
  // 判断是否达到了页面底部
  if ((document.documentElement.scrollTop + document.documentElement.clientHeight) ==
    document.documentElement.scrollHeight) {
    // 实现AJAX请求数据的功能
    // ...
  }
}

其中,document.documentElement.scrollTop表示滚动条滚动的距离,document.documentElement.clientHeight表示窗口可视区域的高度,document.documentElement.scrollHeight表示页面的总高度。

2.2 实现数据请求功能

在达到页面底部的时候,需要向后端请求数据,可以通过AJAX技术实现异步请求数据,代码如下:

let page = 1; // 记录当前的页码
let isLoading = false; // 判断是否正在加载数据

function loadData() {
  if (isLoading) {
    // 如果正在加载数据,则直接退出
    return;
  }

  isLoading = true;
  // 发送AJAX请求
  let xhr = new XMLHttpRequest();
  xhr.open('GET', '/api/getList?page=' + page, true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
      let responseData = JSON.parse(xhr.responseText);
      if (responseData.length > 0) {
        // 如果有数据返回,则先添加到页面上
        addDataToPage(responseData);
        // 加载完成后增加页码
        page++;
      } else {
        // 如果没有数据了,则移除滚动事件
        window.removeEventListener('scroll', onScrollHandler);
      }
      isLoading = false;
    }
  };
  xhr.send();
}

其中,loadData函数实现了向后端请求数据的功能,addDataToPage函数实现了将返回的数据渲染到页面上的功能。需要注意的是,在每次请求数据之前需要通过判断isLoading变量来实现防抖功能,避免在数据加载未完成的情况下重复请求数据。

2.3 实现添加数据到页面的功能

在获取到后端返回的数据之后,需要将数据添加到页面上,可以通过以下代码实现:

function addDataToPage(data) {
  let container = document.querySelector('.data-container');
  for (let i = 0; i < data.length; i++) {
    let item = document.createElement('div');
    item.classList.add('data-item');
    item.innerHTML = data[i];
    container.appendChild(item);
  }
}

其中,data-container表示存放数据的容器元素,data-item表示每一个数据项的样式。

2.4 移除滚动事件

当后端返回的数据为空时,说明已经到达了数据的末尾,需要将滚动事件移除,可以通过以下代码实现:

if (responseData.length > 0) {
  // 如果有数据返回,则先添加到页面上
  addDataToPage(responseData);
  // 加载完成后增加页码
  page++;
} else {
  // 如果没有数据了,则移除滚动事件
  window.removeEventListener('scroll', onScrollHandler);
}

3. 示例说明

以下是两个示例说明,分别是基于jQuery和原生JS实现的页面数据无限加载。

3.1 基于jQuery实现的页面数据无限加载

$(window).scroll(function () {
    if ($(document).scrollTop() + $(window).height() >= $(document).height()) {
        $.ajax({
            type: "GET",
            url: "/api/getList",
            data: {
                page: currentPage
            },
            success: function (data) {
                if (data.length > 0) {
                    addDataToPage(data);
                    currentPage++;
                } else {
                    $(window).unbind('scroll');
                }
            }
        });
    }
});

function addDataToPage(data) {
    for (let i = 0; i < data.length; i++) {
        let item = $("<div class='data-item'></div>");
        item.html(data[i]);
        $(".data-container").append(item);
    }
}

该示例通过$(window).scroll监听滚动事件,$(document).scrollTop()获取滚动条滚动的距离,$(window).height()获取窗口可视区域的高度,$(document).height()获取页面的总高度。当滚动条到达页面底部时,向后端发送请求获取数据,并通过addDataToPage函数将数据添加到页面上。

3.2 基于原生JS实现的页面数据无限加载

window.onscroll = function() {
    if ((document.documentElement.scrollTop + document.documentElement.clientHeight) ==
        document.documentElement.scrollHeight) {
        loadData();
    }
}

function loadData() {
    if (isLoading) {
        return;
    }
    isLoading = true;

    let xhr = new XMLHttpRequest();
    xhr.open("GET", "/api/getList?page=" + currentPage, true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            let data = JSON.parse(xhr.responseText);
            if (data.length > 0) {
                addDataToPage(data);
                currentPage++;
            } else {
                window.removeEventListener('scroll', onScrollHandler);
            }
            isLoading = false;
        }
    };
    xhr.send();
}

function addDataToPage(data) {
    let container = document.querySelector('.data-container');

    for (let i = 0; i < data.length; i++) {
        let item = document.createElement('div');
        item.classList.add('data-item');
        item.innerHTML = data[i];
        container.appendChild(item);
    }
}

该示例的实现过程和前面提到的“实现步骤”是相似的,其中关键的代码部分已经在前面的讲解中提到。不同之处在于它是基于原生JS实现的,不依赖库和框架,更灵活,适合轻量级的场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现页面数据无限加载 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • CSS仿网易首页的头部菜单栏按钮和三角形制作方法

    下面是关于”CSS仿网易首页的头部菜单栏按钮和三角形制作方法”的完整攻略。 制作按钮 制作按钮可以使用CSS中的伪元素::before和::after来实现。 第一步 首先,在HTML中添加一个button元素,并给它一个class名称,例如menu-btn。 <button class="menu-btn">菜单</b…

    css 2023年6月10日
    00
  • 浅谈前端网络、JavaScript优化以及开发小技巧

    浅谈前端网络、JavaScript优化以及开发小技巧 前端技术的发展,让前端页面承载的内容越来越重,优化前端页面成为提高用户体验的必经之路。本文将从网络优化、JavaScript优化以及开发小技巧三个方面来探讨如何优化前端页面。 网络优化 减少HTTP请求 在前端开发中,减少请求次数可以降低页面的加载时间。常见的减少请求次数的方式有两种: 图片合并:将多个小…

    css 2023年6月10日
    00
  • zTree v3.5 Css分解与dom结构说明

    zTree是一款非常流行的树形控件,通过CSS样式控制树形结构的显示,但是有时候样式比较复杂,不容易理解。因此了解zTree的CSS分解和DOM结构对于深入学习和应用zTree非常有帮助。 1. CSS分解 1.1 基础CSS样式 zTree中的基本样式可以通过以下css控制: .ztree {} .ztree li {} .ztree li ul {} .…

    css 2023年6月10日
    00
  • DW如何制作一个简单的垂直导航?

    要制作一个简单的垂直导航,我们可以使用DW(Dreamweaver)提供的视觉化编辑工具和CSS样式来实现。下面是详细的步骤: 步骤一:创建HTML文件和CSS文件 首先,在DW中创建一个新的HTML文档(或打开已有的HTML文档)。然后,使用DW的代码视图或拖放视图向文档中添加一个无序列表(ul)和列表项(li)。 在同一个目录下创建一个CSS文件,用来管…

    css 2023年6月10日
    00
  • webpack踩坑之路图片的路径与打包

    webpack踩坑之路图片的路径与打包 在使用webpack进行项目开发时,难免会遇到图片资源的问题,主要问题集中在图片路径的设置和图片打包。 图片路径的设置 相对路径和绝对路径 在HTML中,图片的路径一般有相对路径和绝对路径两种方式。 相对路径:相对路径是指当前文件所在目录到目标文件的路径。比如:./favicon.ico就代表当前文件夹里的 favic…

    css 2023年6月9日
    00
  • 用div实现像table一样的布局方法

    当我们需要实现像table一样的布局效果时,我们可以使用div元素来代替table元素进行布局。 以下是实现这一效果的步骤: 1. HTML结构 首先,我们需要按照table的结构来构建HTML结构,如下所示: <div class="table"> <div class="table-row"&gt…

    css 2023年6月10日
    00
  • 深入解析CSS的Sass框架中混合宏的使用

    深入解析CSS的Sass框架中混合宏的使用 什么是Sass框架? Sass(Syntactically Awesome StyleShets)是一种CSS的预处理语言,它增加了许多CSS没有的特性,例如嵌套选择器,变量,Mixin宏等。Sass可以帮助开发者简化CSS的编码和维护,并且提高CSS代码的重用性。 Sass中Mixin宏的介绍 Mixin宏是Sa…

    css 2023年6月10日
    00
  • padding盒子内部文字跟盒子之间的距离

    首先,padding 是盒子和其边框之间的空间,而不是盒子内部的空间。因此,padding 会对盒子的大小产生影响,并且也会影响盒子内部内容的位置。 在 CSS 中,我们可以使用 padding 属性来定义盒子的内边距。这个属性可以取一个数值,表示上下左右四个方向的内边距大小(单位可以是 px、em 等),也可以取两个值,表示上下和左右两个方向的内边距大小。…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部