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日

相关文章

  • JavaScript canvas实现流星特效

    下面是详细的JavaScript canvas实现流星特效的攻略: 1. 创建Canvas对象 首先需要在HTML页面中创建一个Canvas元素,并获取它的2D上下文,初始化画布大小。 <canvas id="canvas" width="800" height="600"></c…

    css 2023年6月10日
    00
  • css中的四种定位方式示例介绍

    下面就为您详细讲解 “CSS中的四种定位方式示例介绍”的完整攻略。 什么是CSS的四种定位方式? 在CSS中,常用的定位方式有四种:静态定位(static)、相对定位(relative)、绝对定位(absolute)和固定定位(fixed)。 静态定位:默认定位方式,不做设置,元素按照在文档中的位置显示,并且不可通过top、bottom、left、right…

    css 2023年6月9日
    00
  • 地址栏上的一段语句,改变页面的风格。(教程)

    首先我们需要知道用来改变页面风格的语句是CSS,CSS可以通过在HTML文档的标签内或通过外部CSS样式表来应用于网页中。而改变地址栏上的语句则是使用HTML5的History API中的pushState()方法。 具体的步骤如下: 在HTML文档的标签内或通过外部CSS样式表来定义需要的CSS样式。 例如,在标签内定义一个id为”dark-style”的…

    css 2023年6月10日
    00
  • HTML5中的Scoped属性使用实例

    下面我将详细讲解一下“HTML5中的Scoped属性使用实例”的完整攻略。 简介 scoped属性是HTML5中<style>标签新增的一个属性,表示该样式仅在当前标签内生效。它的使用可以很方便地实现针对特定元素的样式控制。 语法 scoped属性没有取值,只需要在<style>标签中添加该属性即可,例如: <style sco…

    css 2023年6月10日
    00
  • vue.config.js中configureWebpack与chainWebpack区别及说明

    首先需要了解的是,Vue CLI在构建项目时提供了两种自定义Webpack配置的方式:configureWebpack和chainWebpack。它们都在vue.config.js中进行配置。 configureWebpack是一个简单的Webpack配置对象,可以用来覆盖默认的Webpack配置,或者新增一些配置项。例如,下面是一个简单的configure…

    css 2023年6月10日
    00
  • css cursor 的可选值(鼠标的各种样式)

    CSS的cursor属性用于指定鼠标在元素上的样式,它可以控制当鼠标悬停在某个元素上时它的外观表现。下面是所有可选值的详细攻略。 可选值 auto:默认值,浏览器自动设置光标。 default:浏览器默认光标。 none:无光标。 pointer:手势光标,通常用于链接。 progress:忙碌或进行操作,通常用于指示页面正在加载中。 wait:等待,通常用…

    css 2023年6月10日
    00
  • 详解CSS Masking模块之Clipping

    CSS Masking模块之Clipping CSS Masking模块之Clipping为我们提供了在HTML元素上使用图形进行裁剪的功能。使用Clipping可以让我们将元素裁剪成各种形状,可以用于实现一些特殊效果,例如矩形、椭圆、圆形和多边形等等。 基本语法 在CSS中使用Clipping属性,可以使元素具有裁剪功能。具体语法如下: .element …

    css 2023年6月9日
    00
  • type=file的inpu美化,自定义上传按钮样式代码

    下面是详细讲解”Type=file的input美化,自定义上传按钮样式代码”的完整攻略。 什么是type=”file”的input控件? type=”file”的input控件是用于向Web页面的服务器上传文件的控件。它会弹出一个文件对话框,让用户选择需要上传的文件,然后将文件传输给Web服务器。 type=”file”的input控件样式问题 通常情况下,…

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