JavaScript和REST API实现无限滚动分页

无限滚动分页的灵感来自 facebook 和 twitter 等网站。这只是分页,当用户滚动到页面底部时,会加载更多内容。这可以确保页面上始终有更多内容供用户阅读,从而改善网站上的用户体验。

正确执行无限滚动分页

当实现无限滚动分页时,有一些非常重要的要点需要记住。

重要链接不应位于页面底部。这是因为每次用户尝试向下滚动查找它们时,都会加载一组新的条目。所有重要的链接都应固定在侧边栏上或永久保留在顶部。

2.提前计划

计划好要在何处包含分页以及如何处理它非常重要。进行分页的常见方法是在页面底部列出页码。但是,当您使用无限滚动方法时,文章列表的末尾将不再出现页码,因为不再需要它们。只要您不在页脚部分包含大量信息,此分页就可以用于所有主题,因为它可能无法达到预期的效果。

在本教程中,我们将学习如何在 JavaScript 中实现无限滚动功能。

立即学习“Java免费学习笔记(深入)”;

该页面将显示有关猫的有趣事实列表,这些信息将来自 API。该 API 默认返回 10 个有趣的事实。当您滚动到页面底部时,应用程序将显示一个指示器来指示应用程序的加载状态。同时,应用程序将调用 API 来加载下一组有趣的事实。

我们将使用此 URL 来加载有趣的事实。 API 接受查询字符串 page,它告诉 API 要加载哪个页面。

https://catfact.ninja/facts?page=${page}&limit=${limit}

JavaScript和REST API实现无限滚动分页

现在,让我们开始使用该应用程序。

1. 创建项目结构

首先,创建一个具有以下结构的文件夹。

root-- index.html-- style.css-- app.js

2. 构建 HTML 文件

我们的 HTML 文件中将包含几个部分:

一个 container,其中将呈现整个可滚动的有趣事实列表包含每个有趣事实的 quotes 部分loader,加载有趣的事实时将可见。 loader 默认情况下是不可见的。

Fun Facts about Cats

3.构建脚本

接下来,我们需要创建一个脚本,它将连接 div 并加载有趣的事实。为此,我们将使用 querySelector()

const factsEl = document.querySelector('.facts');const loader = document.querySelector('.loader');

我们还需要一些控制变量来定义哪一组项目将显示在屏幕上。这段代码中的控制变量是:

currentPage当前页面初始化为1,当滚动到页面底部时,当前页面会加1,并发出API请求获取下一页的内容页。当页面滚动到顶部时,当前页面将减 1。total此变量存储 Fun Facts API 返回的报价总数。

4. 构建 getFacts 函数

getFacts函数的作用是调用API并返回有趣的事实。 getFacts 函数接受单个参数:page。它使用上面提到的 Fetch API 来获取无限滚动的数据。

Fetch 始终返回 promise,因此我们将使用 await-async 语法来接收和处理响应。要获取 json 数据,我们将使用 json() 函数。 getFacts 函数返回一个承诺,它将解析并返回 JSON。

const getfacts = async (page, limit) => {    const API_URL = `https://catfact.ninja/facts?page=${page}&limit=${limit}`;    const response = await fetch(API_URL);    // handle 404    if (!response.ok) {        throw new Error(`An error occurred: ${response.status}`);    }    return await response.json();}

5. 构建 showFacts 函数

既然我们已经收到了有趣的事实,我们可以在哪里显示这些事实呢?这就是为什么我们需要有一个 showFacts 函数。 showFacts 函数通过迭代 facts 数组来工作。然后,它使用 template Literal 语法创建 fact 对象 的 HTML 表示形式。

const showfacts = (facts) => {    facts.forEach(fact => {        const factEl = document.createElement('blockfact');        factEl.classList.add('fact');        factEl.innerHTML = `            ${fact.fact}        `;        factsEl.appendChild(factEl);    });};

生成的 blockFact 元素的示例是:

      Unlike dogs, cats do not have a sweet tooth. Scientists believe this is due to a mutation in a key taste receptor.

我们利用 appendChild 函数将 元素添加到容器中。

6.显示和隐藏加载指示器

当用户到达页面末尾时,必须显示加载指示器。为此,我们将引入两个函数:一个用于加载,另一个用于隐藏加载器。我们将使用 opacity: 1 显示加载程序,并使用 opacity: 0 隐藏加载程序。添加和删​​除 opacity 将分别显示/隐藏加载程序。

const hideLoader = () => {    loader.classList.remove('show');};const showLoader = () => {    loader.classList.add('show');};

7.查看更多有趣的事实

为了提高性能,我们将引入一个函数来检查 API 是否有更多事实。如果还有更多项目要获取,则 hasMoreFacts() 函数将返回 true。如果没有更多项目可供获取,API 调用将停止。

const hasMorefacts = (page, limit, total) => {    const startIndex = (page - 1) * limit + 1;    return total === 0 || startIndex < total;};

8. 编写 loadFacts 函数代码

loadFacts 函数负责执行这些重要操作:

显示或隐藏加载指示器调用 getFacts 函数获取更多事实展示事实

const loadfacts = async (page, limit) => {    // show the loader    showLoader();    try {        // if having more facts to fetch        if (hasMorefacts(page, limit, total)) {            // call the API to get facts            const response = await getfacts(page, limit);            // show facts            showfacts(response.data);            // update the total            total = response.total;        }    } catch (error) {        console.log(error.message);    } finally {        hideLoader();    }};

从某种意义上说,这种实现的一个缺点是它的运行速度。大多数时候您不会看到加载指示器,因为 API 可以很快返回。如果您想在每次滚动时查看加载指示器,可以使用 setTimeout 函数。调整 setTimeout 函数的 delay 将决定加载指示器显示的时间长度。

9. 处理滚动事件

当用户滚动到页面底部时,需要一个scroll事件处理程序来调用loadFacts函数。如果满足以下条件,该函数将被调用:

滚动条已到达页面底部还有更多事实需要加载

为了实现滚动事件,我们将使用三个窗口属性:

window.scrollHeight 给出整个文档的高度。window.scrollY 给出了用户滚动文档的距离。window.innerHeight 给出可见窗口的高度。

下图更好地概述了上述属性。另外,您将能够理解,如果 innerHeightscrollY 之和等于或大于 scrollHeight,则到达文档末尾,此时必须加载更多有趣的事实。

JavaScript和REST API实现无限滚动分页

window.addEventListener('scroll', () => {    const {        scrollTop,        scrollHeight,        clientHeight    } = document.documentElement;    if (scrollTop + clientHeight >= scrollHeight - 5 &&        hasMoreFacts(currentPage, limit, total)) {        currentPage++;        loadFacts(currentPage, limit);    }}, {    passive: true});

10.初始化页面

无限滚动的最后一步是初始化页面。调用 loadFacts 来加载第一组有趣的事实非常重要。

loadfacts(currentPage, limit);

现场演示

结论

现在,我们在 JavaScript 中实现了一个简单的无限滚动,每当用户滚动时,它将获取并呈现有关猫的有趣事实。这只是无限滚动最常用的方法之一。

以上就是JavaScript和REST API实现无限滚动分页的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1551882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何将当前数字返回为字符串值版本?
上一篇 2025年12月21日 22:08:09
如何使用JavaScript DOM创建表格标题?
下一篇 2025年12月21日 22:08:20

相关推荐

  • 微信删除聊天记录会不会同步删除_删除聊天记录同步情况

    删除微信聊天记录默认仅影响当前设备,不会同步至其他设备;通过电脑备份可恢复记录;利用iCloud可选择性恢复历史数据;启用外部存储可实现自动备份。 如果您在使用微信时删除了聊天记录,可能会疑惑这些操作是否会在其他设备上同步生效。这取决于您的删除方式以及设备间的同步设置。以下是不同场景下的具体表现和处…

    2026年9月3日
    000
  • 高效连接Firebase Analytics和BigQuery:rezuankassim/bqanalytic库实战

    在开发一个需要分析用户行为的项目时,我面临着一个挑战:如何高效地将firebase analytics收集的用户数据导入到bigquery中,并最终整合到我的应用数据库中。传统的方案需要编写大量的代码来处理数据转换、api调用和数据库交互,费时费力且容易出错。 幸运的是,我发现了rezuankass…

    2026年9月3日
    000
  • Spring MVC和Dubbo请求参数中,Serializable接口究竟何时需要实现?

    Spring MVC与Dubbo请求参数中的序列化:何时需要实现Serializable接口? 本文探讨Spring MVC和Dubbo框架下,请求参数是否需要实现Serializable接口的问题。 Serializable接口的作用 Serializable接口用于对象的序列化,即将对象转换为字…

    2026年9月3日
    000
  • linux使用手册之安装Clion和运行使用总结

    linux使用手册之安装Clion和运行使用总结linux使用手册之安装Clion和运行使用总结linux使用手册之安装Clion和运行使用总结linux使用手册之安装Clion和运行使用总结

       本篇文章给大家带来的内容是关于如何使用linux之安装Clion和运行使用总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、Clion的简单介绍          clion是以intellij为基础,专为开发c及c++所设计的跨平台ide,可以在windows、lin…

    2026年9月3日 用户投稿
    100
  • MySQLCPU资源消耗优化_MySQL减少查询CPU使用技巧

    MySQLCPU资源消耗优化_MySQL减少查询CPU使用技巧MySQLCPU资源消耗优化_MySQL减少查询CPU使用技巧MySQLCPU资源消耗优化_MySQL减少查询CPU使用技巧MySQLCPU资源消耗优化_MySQL减少查询CPU使用技巧

    mysql cpu占用率高的核心原因是低效sql查询、缺失索引、高并发连接和不合理配置。1. 优化sql语句,避免全表扫描、复杂join和函数操作,使用explain分析执行计划;2. 合理创建索引,提升查询效率;3. 控制并发连接,减少线程切换开销;4. 调整innodb_buffer_pool_…

    2026年9月3日 用户投稿
    000
  • 百度极速版多少金币是一元 百度极速版金币兑换想相关

    目前百度极速版的金币兑换规则已经有所调整,与以往不同。以前是固定的1000金币兑换1元,而现在采用了浮动机制,具体兑换比例会根据平台收益进行相应调整。尽管如此,百度极速版仍然是一款实用的应用程序。相较于普通版百度,它占用内存更小,同时保留了大部分核心功能,并且还支持用户通过使用赚取现金奖励,整体体验…

    2026年9月3日
    000
  • 苏丹的游戏列王纪获得方法 铜读物列王纪获取攻略

    苏丹的游戏中铜色品质的读物【列王纪】的获取方式共有三种,其一是通过【书店营业】事件,在其中投入1枚金币和一个随机角色后,有一定概率获得;其二是参与【淘书】事件,放入3枚金币并通过相应检定后,也有机会获取;第三种方式是在命运商店解锁【管不住的手】后,进入【赃物商人】事件,放入5枚金币与一个随机角色后,…

    2026年9月3日
    000
  • win11无法安全删除USB大容量存储设备怎么办_U盘无法弹出问题解决方法

    当U盘提示“设备正在使用中”时,可通过关闭占用程序、重启资源管理器、使用diskpart命令脱机、更改删除策略、事件查看器排查或设备管理器卸载设备来解决。 如果您尝试通过系统托盘图标或“此电脑”窗口安全弹出U盘时,系统提示“设备正在使用中”,则可能是由于后台程序、服务或系统进程占用了该设备。以下是解…

    2026年9月3日
    300
  • 光峰科技收到知名车企定点通知,预计今年量产供货车载光学部件

    光峰科技喜获知名车企定点通知书,将为其新时代科技品牌suv车型供应智能座舱显示产品,预计2025年量产。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 此次合作彰显了客户对光峰科技车规级投影巨幕技术、优质服务和供货能力的高度认可。 随着智能…

    2026年9月3日
    000
  • excel中filter函数怎么使用_filter函数动态筛选数据使用方法

    FILTER函数可实现Excel中基于条件的动态数据筛选,通过“=FILTER(数组, 条件, 无匹配返回值)”语法结构,支持单条件、多条件(与/或)、文本模糊匹配及日期筛选,并能结合单元格输入实现动态查询,同时建议设置第三参数或使用IFERROR避免错误显示,提升报表交互性与稳定性。 如果您在Ex…

    2026年9月3日
    000
  • B端设备租赁:企业资产管理App应用开发

    在工程、医疗、it服务等设备密集型行业中,b端设备租赁正逐渐成为企业优化资金流动、灵活应对项目需求的重要方式。然而,面对数量庞大、状态多变、分布广泛的租赁设备资产,如何有效管理、避免闲置浪费与调度混乱、减少维护滞后等问题,成为众多企业亟需解决的难题。此时,开发专业的企业资产管理app应用便成为突破困…

    2026年9月3日
    300
  • 使用ThinkPHP6和Swoole开发的RPC服务实现高效任务处理

    标题:使用ThinkPHP6和Swoole开发的RPC服务实现高效任务处理 正文: 一、引言 随着互联网的快速发展和应用场景的多样化,高效的任务处理变得愈发重要。而基于RPC(Remote Procedure Call,远程过程调用)的服务架构可以实现跨服务器通信,提高数据处理效率和可靠性。本文将介…

    2026年9月3日
    000
  • 168.31.1小米路由器无线网络配置教程

    小米路由器无线网络配置很简单,先通电并用网线连接电脑和路由器lan口;2. 打开浏览器输入192.168.31.1进入管理界面,若无法访问可检查ip设置或重置路由器;3. 根据宽带类型选择上网方式:自动获得ip地址(dhcp)、pppoe拨号(需输入账号密码)或静态ip(手动填写运营商提供的信息);…

    2026年9月3日
    000
  • Spring MVC和Dubbo中,请求参数的Serializable接口有何区别?

    Spring MVC和Dubbo中请求参数的Serializable接口差异详解 Spring MVC和Dubbo在处理请求参数时,对Serializable接口的使用存在显著区别,这源于它们底层数据传输机制的不同。 Spring MVC:无需Serializable Spring MVC框架基于H…

    2026年9月3日
    300
  • mysql怎么添加注释

    mysql添加注释的方法:1、使用“alter table 表名 modify 字段名 类型 约束 comment ‘注释内容’;”语句为字段添加注释;2、用“alter table 表名 comment ‘注释内容’;”语句为表添加注释。 本教程操作…

    2026年9月3日
    100
  • oppo手机打开安卓siri的操作步骤

    php小编草莓为您介绍oppo手机如何打开安卓版本的siri。操作步骤简单明了,只需在手机设置中找到语音助手选项,然后启用对应的siri功能即可。通过设置界面调整语音助手的设置,您可以根据个人喜好和需求来自定义语音助手的功能和应用范围,提升手机使用体验。愿您享受到更便捷的智能手机操作体验! 1、打开…

    2026年9月3日
    100
  • 点淘直播间怎么进入_点淘直播间如何进入观看互动购物教程

    1、打开点淘APP点击首页,滑动查找直播卡片进入;2、通过顶部搜索框输入主播或商品名,切换至直播页进入;3、在“我的”关注列表中查看正在直播的主播;4、从商品详情页的直播提示按钮跳转进入直播间。 如果您想通过点淘APP观看直播并参与互动购物,但不清楚如何进入直播间,可能是由于入口位置不熟悉或操作流程…

    2026年9月3日
    000
  • Linux实例(一)使用用户名密码验证连接Linux

    本篇文章给大家带来的内容是关于使用用户名密码验证连接linux,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 如果您使用的是 SSH 密钥对,请参考 使用SSH密钥对连接Linux实例。 如果您要使用 ECS 控制台的管理终端,请参考 步骤 3:连接ECS实例。 前提条件 在远程连…

    2026年9月3日
    000
  • 我的世界不可获得物品有哪些 不可获得物品种类介绍

    我的世界不可获得物品有哪些 不可获得物品种类介绍我的世界不可获得物品有哪些 不可获得物品种类介绍我的世界不可获得物品有哪些 不可获得物品种类介绍我的世界不可获得物品有哪些 不可获得物品种类介绍

    我的世界中存在一些在生存模式下无法正常获取的特殊物品,主要包括屏障方块、结构方块和命令方块,以下是对这些物品及其特点的具体介绍。 我的世界不可获得物品具体如下: 一、屏障方块属于生存模式中无法正常获取的物品,除非使用作弊手段。该方块在创造模式中可以找到,放置后呈隐形状态,常用于地图设计中控制玩家活动…

    2026年9月3日 用户投稿
    100
  • 高效解决 Laravel Eloquent 关联查询中的大小写问题

    最近在开发一个 laravel 项目时,遇到了一个令人头疼的 bug。我的数据库使用了区分大小写的字符集,而 item_tag 表中的 item_uuid 字段存储的是字符串类型的 uuid。 item 模型和 tag 模型之间存在多对多关系。当我使用 item::with(‘tags’)->…

    用户投稿 2026年9月3日
    000

发表回复

登录后才能评论
关注微信