讲师中心 微信公众号
AI工具推荐 视频效率加速

构建可搜索的动态表格:JavaScript与API数据过滤教程

阿墨同学_8838

阿墨同学_8838

发布时间:2025-11-15 11:55:36

|

241人浏览过

|

来源于php中文网

原创

构建可搜索的动态表格:JavaScript与API数据过滤教程

本教程将指导您如何利用javascript实现一个动态数据表格的搜索功能。通过从api获取数据并将其存储在全局变量中,我们能够结合用户输入,使用数组的`filter()`方法高效地筛选出匹配项,并实时更新html表格,从而为用户提供一个响应式且高效的数据查询体验。

在现代Web应用中,动态展示和搜索大量数据是常见的需求。本教程将详细介绍如何使用纯JavaScript,结合API数据和HTML表格,实现一个高效且用户友好的搜索功能。

一、数据获取与全局存储

为了实现高效的搜索功能,避免每次用户搜索时都重新请求API,我们应该在页面加载时一次性获取所有数据,并将其存储在一个全局可访问的变量中。

首先,定义一个全局变量 countriesData 用于存储从API获取的原始国家数据。

let countriesData = []; // 全局变量,用于存储所有国家数据

/**
 * 异步获取API数据
 */
const getdata = async () => {
    const endpoint = "https://api.covid19api.com/summary";
    try {
        const response = await fetch(endpoint);
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        const data = await response.json();
        countriesData = data.Countries; // 将获取到的国家数据存储到全局变量
        _DisplayCountries(); // 数据加载完成后,立即显示所有国家
    } catch (error) {
        console.error("获取数据失败:", error);
        // 可以添加用户友好的错误提示
    }
}

getdata(); // 页面加载时调用,获取并显示数据

二、HTML结构:搜索框与数据表格

我们需要一个输入框供用户输入搜索关键词,一个按钮触发搜索,以及一个HTML表格来展示数据。

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

<!-- 搜索框与搜索按钮 -->
<input type="text" id="myInput" placeholder=" 搜索国家 ">
<input type="submit" id="mySubmit" value="搜索" class="submit">

<!-- 数据表格 -->
<table class="table">
    <thead>
        <tr>
            <th scope="col">国家</th>
            <th scope="col">新增确诊</th>
            <th scope="col">累计确诊</th>
            <th scope="col">新增死亡</th>
            <th scope="col">累计死亡</th>
            <th scope="col">新增治愈</th>
            <th scope="col">累计治愈</th>
            <th scope="col">最后更新时间</th>
        </tr>
    </thead>
    <tbody id="tbody">
        <!-- 数据将动态加载到这里 -->
    </tbody>
</table>

注意: 确保搜索按钮有一个唯一的 id (例如 mySubmit),以便我们可以在JavaScript中轻松地为其添加事件监听器。

三、实现数据过滤与动态显示

这是实现搜索功能的核心部分。我们将创建一个独立的函数 _DisplayCountries,它负责根据传入的搜索关键词过滤 countriesData,并更新HTML表格。

/**
 * 根据关键词过滤并显示国家数据
 * @param {string} searchTerm - 用户输入的搜索关键词,默认为空字符串
 */
const _DisplayCountries = (searchTerm = "") => {
    const tbody = document.querySelector("#tbody");
    tbody.innerHTML = ``; // 清空表格当前内容

    // 使用filter方法过滤数据
    const filteredCountries = countriesData.filter(country =>
        // 将国家名称和搜索关键词都转换为小写,实现大小写不敏感搜索
        country.Country.toLowerCase().includes(searchTerm.toLowerCase())
    );

    // 遍历过滤后的数据,并将其添加到表格中
    filteredCountries.forEach(result => {
        tbody.innerHTML += `<tr>
            <td>${result.Country}</td>
            <td>${result.NewConfirmed}</td>
            <td>${result.TotalConfirmed}</td>
            <td>${result.NewDeaths}</td>
            <td>${result.TotalDeaths}</td>
            <td>${result.NewRecovered}</td>
            <td>${result.TotalRecovered}</td>
            <td>${new Date(result.Date).toLocaleString()}</td>
        </tr>`;
    });

    // 如果没有搜索结果,可以显示提示信息
    if (filteredCountries.length === 0 && searchTerm !== "") {
        tbody.innerHTML = `<tr><td colspan="8" style="text-align: center;">未找到匹配 "${searchTerm}" 的国家。</td></tr>`;
    }
}

在这个函数中,我们首先清空 <tbody> 的内容,然后使用 Array.prototype.filter() 方法根据 searchTerm 过滤 countriesData 数组。为了实现大小写不敏感的搜索,我们将 country.Country 和 searchTerm 都转换为小写再进行比较。最后,遍历过滤后的结果,并构建相应的表格行。

Html2md
Html2md

使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...

下载

四、绑定搜索事件

最后一步是监听搜索按钮的点击事件。当用户点击“搜索”按钮时,我们获取输入框中的值,并将其传递给 _DisplayCountries 函数。

document.querySelector("#mySubmit").addEventListener("click", () => {
    const searchInput = document.querySelector("#myInput");
    _DisplayCountries(searchInput.value); // 调用显示函数,传入搜索框的值
});

五、完整示例代码

将以上所有JavaScript和HTML代码组合起来,即可实现完整的搜索功能。

HTML (index.html):

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>可搜索的动态数据表格</title>
    <style>
        body { font-family: sans-serif; margin: 20px; }
        .table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        .table th, .table td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        .table th { background-color: #f2f2f2; }
        #myInput { padding: 8px; width: 200px; margin-right: 10px; border: 1px solid #ccc; border-radius: 4px;}
        #mySubmit { padding: 8px 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
        #mySubmit:hover { background-color: #0056b3; }
    </style>
</head>
<body>

    <h1>全球疫情数据查询</h1>

    <!-- 搜索框与搜索按钮 -->
    <input type="text" id="myInput" placeholder=" 搜索国家 ">
    <input type="submit" id="mySubmit" value="搜索" class="submit">

    <!-- 数据表格 -->
    <table class="table">
        <thead>
            <tr>
                <th scope="col">国家</th>
                <th scope="col">新增确诊</th>
                <th scope="col">累计确诊</th>
                <th scope="col">新增死亡</th>
                <th scope="col">累计死亡</th>
                <th scope="col">新增治愈</th>
                <th scope="col">累计治愈</th>
                <th scope="col">最后更新时间</th>
            </tr>
        </thead>
        <tbody id="tbody">
            <!-- 数据将动态加载到这里 -->
        </tbody>
    </table>

    <script src="app.js"></script>
</body>
</html>

JavaScript (app.js):

let countriesData = []; // 全局变量,用于存储所有国家数据

/**
 * 异步获取API数据
 */
const getdata = async () => {
    const endpoint = "https://api.covid19api.com/summary";
    try {
        const response = await fetch(endpoint);
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        const data = await response.json();
        countriesData = data.Countries; // 将获取到的国家数据存储到全局变量
        _DisplayCountries(); // 数据加载完成后,立即显示所有国家
    } catch (error) {
        console.error("获取数据失败:", error);
        const tbody = document.querySelector("#tbody");
        tbody.innerHTML = `<tr><td colspan="8" style="text-align: center; color: red;">数据加载失败,请稍后再试。</td></tr>`;
    }
}

/**
 * 根据关键词过滤并显示国家数据
 * @param {string} searchTerm - 用户输入的搜索关键词,默认为空字符串
 */
const _DisplayCountries = (searchTerm = "") => {
    const tbody = document.querySelector("#tbody");
    tbody.innerHTML = ``; // 清空表格当前内容

    // 使用filter方法过滤数据
    const filteredCountries = countriesData.filter(country =>
        // 将国家名称和搜索关键词都转换为小写,实现大小写不敏感搜索
        country.Country.toLowerCase().includes(searchTerm.toLowerCase())
    );

    // 遍历过滤后的数据,并将其添加到表格中
    if (filteredCountries.length > 0) {
        filteredCountries.forEach(result => {
            tbody.innerHTML += `<tr>
                <td>${result.Country}</td>
                <td>${result.NewConfirmed}</td>
                <td>${result.TotalConfirmed}</td>
                <td>${result.NewDeaths}</td>
                <td>${result.TotalDeaths}</td>
                <td>${result.NewRecovered}</td>
                <td>${result.TotalRecovered}</td>
                <td>${new Date(result.Date).toLocaleString()}</td>
            </tr>`;
        });
    } else {
        // 如果没有搜索结果,可以显示提示信息
        tbody.innerHTML = `<tr><td colspan="8" style="text-align: center;">未找到匹配 "${searchTerm}" 的国家。</td></tr>`;
    }
}

// 页面加载时调用,获取并显示数据
getdata();

// 绑定搜索按钮点击事件
document.querySelector("#mySubmit").addEventListener("click", () => {
    const searchInput = document.querySelector("#myInput");
    _DisplayCountries(searchInput.value); // 调用显示函数,传入搜索框的值
});

六、优化与扩展

为了提升用户体验和代码的灵活性,我们可以考虑以下优化和扩展:

  1. 大小写不敏感匹配的替代方案: 除了 toLowerCase().includes(),还可以使用正则表达式进行更灵活的匹配。例如:

    const _DisplayCountries = (searchTerm = "") => {
        const tbody = document.querySelector("#tbody");
        tbody.innerHTML = ``;
    
        // 创建一个正则表达式,'i' 标志表示不区分大小写
        const regex = new RegExp(searchTerm, "i");
        const filteredCountries = countriesData.filter(country =>
            country.Country.match(regex)
        );
        // ... 后续渲染逻辑不变
    }

    这种方式在处理更复杂的模式匹配时更为强大。

  2. 实时搜索(即时过滤): 将事件监听器从搜索按钮的 click 事件改为搜索输入框的 input 或 keyup 事件,可以在用户输入时立即更新结果,提供更流畅的体验。

    document.querySelector("#myInput").addEventListener("input", (e) => {
        _DisplayCountries(e.target.value);
    });
    
    // 如果改为实时搜索,搜索按钮可以移除或改变其功能
    // document.querySelector("#mySubmit").removeEventListener("click", ...);
  3. 性能考量(防抖/节流): 对于实时搜索,如果数据集非常庞大,频繁触发过滤和DOM操作可能会导致性能问题。此时可以引入防抖(debounce)或节流(throttle)技术,限制函数的执行频率。

    • 防抖: 在一定时间内,如果事件再次触发,则重新计时。只有当事件停止触发一段时间后,才执行函数。适用于搜索框输入。
    • 节流: 在一定时间内,函数只执行一次。适用于滚动、窗口调整大小等。
  4. 用户体验增强:

    • 加载指示器: 在API请求期间显示一个加载动画或文本,告知用户数据正在加载。
    • 空结果提示: 当搜索结果为空时,显示友好的提示信息(已在示例中添加)。
    • 排序功能: 允许用户点击表格头对数据进行排序。
  5. 错误处理: 在 getdata 函数中添加 try...catch 块,可以捕获API请求或解析数据时可能发生的错误,并向用户提供反馈,增强应用的健壮性。

总结

通过本教程,我们学习了如何利用JavaScript实现一个动态数据表格的搜索功能。核心步骤包括:一次性获取并全局存储API数据、构建清晰的HTML结构、使用 Array.prototype.filter() 方法结合大小写不敏感匹配逻辑进行数据过滤,以及将过滤后的数据动态渲染到HTML表格中。通过分离数据获取、过滤和显示逻辑,并考虑事件绑定和性能优化,我们可以构建出高效、响应式且用户体验良好的Web应用。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4436

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2941

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

8122

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

812

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

520

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

673

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

386

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

719

2023.12.06

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn