J*aScript中从API获取并结构化展示数据的教程


JavaScript中从API获取并结构化展示数据的教程

本教程旨在指导开发者如何利用j*ascript和axios库从外部api异步获取数据,并将其有效组织和展示。文章将详细讲解如何正确处理api响应,避免常见的`undefined`错误,并通过实例代码演示如何将嵌套数据结构(如分类及其线索)解析并动态渲染到网页上,从而帮助读者掌握数据获取、处理与前端展示的关键技巧。

在现代Web开发中,从外部API获取数据并将其以结构化方式呈现在用户界面上是一项核心任务。本教程将以一个具体的示例,即从jservice.io API获取问答分类及线索数据,来详细讲解这一过程中的关键技术和常见问题解决方案。

准备工作与初始设置

首先,我们需要引入axios库来处理HTTP请求,并定义API的基础URL以及一些常量。

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<div id="app-container">
  <button onclick="startGame()">开始游戏</button>
  <p id="status"></p>
  <div id="form-fields" style="display:none;">
    <p>
      请输入一个类别编号 (0-5),以查看其线索。
    </p>
    <input type="number" id="catIdInput" value="0"/>
    <button onclick="displayCategoryClues()">显示线索</button>
  </div>
</div>
<div id="output"></div>
let url = "https://jservice.io/api";
const NUM_CATEGORIES = 6; // 定义要获取的类别数量
let categories = []; // 用于存储获取到的类别数据

// 随机数,用于在获取单个类别时指定ID。
// 注意:实际应用中,为了获取不重复的随机类别,可能需要更复杂的逻辑。
let randomNum = Math.floor(Math.random() * 101);

获取随机类别ID并存储数据

数据获取的第一步是请求API以获取指定数量的随机类别。这里我们定义一个异步函数getCategoryIds来完成这个任务。

/**
 * 从API获取指定数量的随机类别。
 * 每个API响应的data部分包含一个类别对象,我们将其推入categories数组。
 */
async function getCategoryIds() {
    let statusElement = document.getElementById("status");
    let formFieldsElement = document.getElementById("form-fields");

    statusElement.innerText = '正在获取数据,请稍候...';
    console.log('正在获取数据,请稍候...');

    for (let i = 0; i < NUM_CATEGORIES; i++) {
        // 注意:这里每次都使用相同的 randomNum,这会导致重复获取同一个类别。
        // 在实际应用中,应该为每次请求生成一个新的随机ID,或者从一个类别ID列表中随机选择。
        let res = await axios.get(`${url}/category?id=${randomNum + i}`); // 临时修改以获取不同ID
        // 关键点:axios返回的是一个响应对象,实际数据存储在res.data中。
        // 错误的做法是 categories.push(res),这会导致后续访问数据时出现 res.data.data 的问题。
        categories.push(res.data);
    }

    statusElement.innerText = '数据获取完成!';
    console.log('数据获取完成!', categories);
    formFieldsElement.style.display = 'block'; // 显示输入框和按钮
}

重要提示: 在上述getCategoryIds函数中,一个常见的错误是将整个axios响应对象res推入categories数组,而不是其包含实际数据的res.data。如果categories.push(res),那么categories数组中的每个元素将是Axios响应对象,其真实数据位于element.data。这会导致尝试访问categories[index].data时,如果categories数组中存储的是res.data,则会得到undefined。正确的做法是categories.push(res.data),确保categories数组直接包含API返回的类别数据对象。

访问并展示特定类别的线索

一旦categories数组被正确填充,我们就可以编写函数来根据用户输入访问特定类别的线索,并将其动态渲染到页面上。

蚂蚁PPT 蚂蚁PPT

AI在线智能生成PPT

蚂蚁PPT 113 查看详情 蚂蚁PPT
/**
 * 根据用户选择的类别ID,显示该类别的所有线索(问题和答案)。
 * @param {number} catId - 用户输入的类别索引。
 */
function displayCategoryClues() {
    let catIdInput = document.getElementById("catIdInput");
    let outputElement = document.getElementById("output");
    let selectedCatId = parseInt(catIdInput.value);

    // 验证输入的类别ID是否有效
    if (isNaN(selectedCatId) || selectedCatId < 0 || selectedCatId >= categories.length) {
        outputElement.innerHTML = '<p style="color: red;">请输入一个有效的类别编号 (0-' + (categories.length - 1) + ').</p>';
        return;
    }

    let category = categories[selectedCatId]; // 直接通过索引访问类别对象

    if (!category || !category.clues) {
        outputElement.innerHTML = '<p style="color: red;">所选类别无数据或无线索。</p>';
        return;
    }

    let cluesHtml = `<h2>${category.title}</h2><div>`;
    category.clues.forEach((clue, index) => {
        cluesHtml += `<p><strong>${index + 1}. 问题:</strong> ${clue.question}<br>`;
        cluesHtml += `<strong>答案:</strong> <i>${clue.answer}</i></p>`;
    });
    cluesHtml += '</div>';

    outputElement.innerHTML = cluesHtml;
    console.log('线索已生成并显示。');
}

在displayCategoryClues函数中,我们通过categories[selectedCatId]直接访问到存储在categories数组中的特定类别对象。然后,通过遍历该类别的clues数组,我们可以提取每个问题和答案,并将其格式化为HTML字符串,最终插入到页面的output元素中。

整合与运行

为了让整个流程能够运行,我们需要在HTML中调用这些J*aScript函数。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>J*aScript API数据获取与展示教程</title>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        #app-container { border: 1px solid #ccc; padding: 20px; border-radius: 8px; margin-bottom: 20px; }
        #output { border: 1px solid #eee; padding: 15px; background-color: #f9f9f9; border-radius: 5px; }
        h2 { color: #333; }
        p strong { color: #555; }
        p i { color: #007bff; }
    </style>
</head>
<body>

    <div id="app-container">
        <h1>Jeopardy风格问答数据展示</h1>
        <button onclick="startGame()">开始获取数据</button>
        <p id="status"></p>
        <div id="form-fields" style="display:none;">
            <p>
                数据已加载。现在,请输入一个类别编号 (0-5) 以查看其线索。<br>
                (例如,输入 `0` 查看第一个类别,输入 `5` 查看第六个类别。)
            </p>
            <input type="number" id="catIdInput" value="0" min="0" max="5"/>
            <button onclick="displayCategoryClues()">显示线索</button>
        </div>
    </div>
    <div id="output"></div>

    <script>
        let url = "https://jservice.io/api";
        const NUM_CATEGORIES = 6;
        let categories = [];
        let randomBaseId = Math.floor(Math.random() * 100) + 1; // 初始随机ID

        async function startGame() {
            document.getElementById("form-fields").style.display = 'none'; // 隐藏输入框直到数据加载
            await getCategoryIds();
        }

        async function getCategoryIds() {
            let statusElement = document.getElementById("status");
            let formFieldsElement = document.getElementById("form-fields");

            statusElement.innerText = '正在获取数据,请稍候...';
            console.log('正在获取数据,请稍候...');
            categories = []; // 每次开始游戏前清空旧数据

            for (let i = 0; i < NUM_CATEGORIES; i++) {
                // 为了获取不同的类别,每次请求时增加ID
                let currentCatId = randomBaseId + i;
                try {
                    let res = await axios.get(`${url}/category?id=${currentCatId}`);
                    if (res.data && res.data.id) { // 确保返回了有效类别数据
                        categories.push(res.data);
                    } else {
                        console.warn(`获取ID为 ${currentCatId} 的类别失败或数据无效。`);
                    }
                } catch (error) {
                    console.error(`请求类别ID ${currentCatId} 发生错误:`, error);
                    statusElement.innerText = `获取数据失败: ${error.message}`;
                    return; // 遇到错误则停止
                }
            }

            statusElement.innerText = '数据获取完成!已加载 ' + categories.length + ' 个类别。';
            console.log('数据获取完成!', categories);
            if (categories.length > 0) {
                document.getElementById("catIdInput").max = categories.length - 1; // 更新输入框的最大值
                formFieldsElement.style.display = 'block'; // 显示输入框和按钮
            } else {
                statusElement.innerText = '未能加载任何类别,请检查API或网络。';
            }
        }

        function displayCategoryClues() {
            let catIdInput = document.getElementById("catIdInput");
            let outputElement = document.getElementById("output");
            let selectedCatId = parseInt(catIdInput.value);

            if (isNaN(selectedCatId) || selectedCatId < 0 || selectedCatId >= categories.length) {
                outputElement.innerHTML = '<p style="color: red;">请输入一个有效的类别编号 (0-' + (categories.length - 1) + ').</p>';
                return;
            }

            let category = categories[selectedCatId];

            if (!category || !category.clues || category.clues.length === 0) {
                outputElement.innerHTML = `<p style="color: red;">类别 "${category ? category.title : '未知'}" 无线索可显示。</p>`;
                return;
            }

            let cluesHtml = `<h2>类别: ${category.title}</h2><div>`;
            category.clues.forEach((clue, index) => {
                cluesHtml += `<p><strong>${index + 1}. 问题:</strong> ${clue.question}<br>`;
                cluesHtml += `<strong>答案:</strong> <i>${clue.answer}</i></p>`;
            });
            cluesHtml += '</div>';

            outputElement.innerHTML = cluesHtml;
            console.log('线索已生成并显示。');
        }
    </script>

</body>
</html>

总结与注意事项

  1. Axios响应结构: 始终记住axios.get()返回的是一个包含data属性的响应对象,实际的API数据存储在res.data中。直接将res推入数组而不提取res.data是导致后续数据访问失败的常见原因。
  2. 异步操作: 使用async/await是处理异步HTTP请求的最佳实践,它使代码更易读、更接近同步执行的逻辑。
  3. 数据验证与错误处理: 在实际应用中,应增加对API响应的验证,例如检查res.data是否为null或undefined,以及对网络请求失败进行错误捕获。
  4. 动态DOM操作: 通过J*aScript动态生成HTML内容并更新DOM是前端交互的关键。注意避免XSS攻击,对于用户输入的内容,应进行适当的净化处理。
  5. API调用频率: 在使用公共API时,请注意其调用频率限制,避免因频繁请求而被封禁IP。
  6. 数据结构理解: 在开始编写代码之前,花时间理解API返回的数据结构至关重要。使用浏览器开发者工具(Network Tab)检查API响应,或打印console.log(res.data)来查看其结构。

通过遵循本教程中的步骤和最佳实践,您将能够有效地从API获取、处理和展示数据,为您的Web应用程序构建强大的数据驱动功能。

以上就是J*aScript中从API获取并结构化展示数据的教程的详细内容,更多请关注其它相关文章!


# 百度推广网站立即有效吗  # 输入框  # 结构化  # 加载  # 有什么  # 这会  # 组中  # 如何让百度关键词排名  # 新建的影视网站如何推广  # 请稍候  # 开封网站优化报价方案  # 本地的seo优化  # 网络创意营销推广案例  # 福田推广网站优化效果好  # 广汉婚庆网站建设  # 海口整站优化网站  # 杭州智能营销推广系统  # javascript  # 请输入  # 的是  # 数据结构  # web应用程  # ios  # ai  # 工具  # axios  # app  # 浏览器  # go  # 前端  # js  # html  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法  iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南  《暗黑破坏神4》国服回归送狂欢礼包 价值6916元  快手极速版在线体验区 快手极速版网页体验入口  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  J*aScript模块加载器_RequireJS原理分析  路由器DNS怎么设置最快 优化DNS提升上网速度教程  批改网官网首页登录 批改网学生用户登录入口  MongoDB聚合管道:高效统计列表中各项的文档数量  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用  韩剧圈正版官网入口_韩剧圈官方指定登录  WooCommerce购物车:强制显示所有交叉销售商品教程  铁路12306官网登录入口 铁路12306在线购票官方平台  LINUX怎么查看显卡信息_LINUX查看GPU状态  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  《三角洲行动》战斗步枪与机枪类改装代码分享  三星M34录音变声问题_Samsung M34麦克风调整  Yandex俄罗斯搜索引擎官网入口 Yandex网页端直接访问  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  在Dash应用中自定义HTML标题和网站图标  晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制  《搜书吧》阅读书籍方法  德邦物流在线查询系统 德邦快递货物运输追踪  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  《优志愿》修改手机号方法  电脑视频号|直播|如何分享屏幕  漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程  Fedora怎么安装 Fedora Workstation安装步骤  Python中对象引用与链表属性赋值的机制解析  背部总是隐隐作痛怎么回事 背痛如何改善  Linux如何开发轻量级数据服务模块_Linux服务化设计  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  如何在CSS中设置背景图像:一个全面指南  知音漫客官网首页入口_知音漫客热门漫画推荐  人教版电子教材在线获取指南  嘀嗒顺风车如何开具电子发票  漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐  mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法  《海底捞》点外卖方法  可米酷漫画在线阅读入口_ 可米酷漫画官网直达链接  智学网成绩单查询系统网_智学网学生平台登录  Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】  Go App Engine 项目结构与包管理深度指南  小米手机截图后如何查看历史_小米手机截图历史记录查看方法  Keras中Convolution2D层及其核心辅助层详解  Linux如何自动分析系统异常日志_Linux日志智能检测  J*a列表元素格式化输出教程 

 2025-12-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.