JavaScript原生AJAX实现天气API数据获取与展示:温度与描述

JavaScript原生AJAX实现天气API数据获取与展示:温度与描述

本文详细讲解如何使用原生JavaScript的XMLHttpRequest对象实现AJAX请求,从天气API获取数据。我们将重点演示如何准确地访问JSON响应中嵌套的温度(main.temp)和天气描述(weather[0].description)字段,并将这些信息同时显示在网页上,提供完整的代码示例和解析。

1. 理解API响应的JSON数据结构

在从api获取数据之前,首先需要了解api返回的数据结构。一个典型的天气api响应通常是一个json对象,其中包含多个嵌套的对象和数组。例如,我们所使用的api(https://mm214.com/jsondemo.php)可能返回类似以下结构的json数据:

{  "coord": { /* ... */ },  "weather": [{    "id": 300,    "main": "Drizzle",    "description": "light intensity drizzle", // 我们需要的天气描述    "icon": "09d"  }],  "base": "stations",  "main": {    "temp": 280.32, // 我们需要的温度    "pressure": 1012,    "humidity": 81,    "temp_min": 279.15,    "temp_max": 281.15  },  "visibility": 10000,  "wind": { /* ... */ },  "clouds": { /* ... */ },  "dt": 1485789600,  "sys": { /* ... */ },  "id": 2643743,  "name": "London",  "cod": 200}

从上述结构中,我们可以看到:

温度(Temperature):位于 main 对象内部的 temp 字段,通过 data.main.temp 访问。天气描述(Weather Description):位于 weather 数组的第一个元素(一个对象)内部的 description 字段。因此,需要通过 data.weather[0].description 访问。weather 字段是一个数组,即使只有一个天气状况,它也会被封装在一个数组中。

理解这种嵌套结构是正确获取数据的关键。

2. 使用XMLHttpRequest实现AJAX请求

XMLHttpRequest (XHR) 是浏览器内置的API,用于在不重新加载页面的情况下向服务器发送HTTP请求和接收响应。以下是一个封装了XHR请求的 getJSON 函数:

const getJSON = function(url, callback) {    let xhr = new XMLHttpRequest();    xhr.open('GET', url, true); // 初始化请求,使用GET方法,并设置为异步    xhr.responseType = 'json'; // 期望服务器响应的数据类型为JSON    // 监听请求状态变化或响应加载完成    xhr.onload = function() {        let status = xhr.status;        if (status === 200) { // HTTP状态码200表示请求成功            callback(null, xhr.response); // 调用回调函数,传递null作为错误,xhr.response作为数据        } else {            callback(status); // 如果状态码不是200,传递状态码作为错误        }    };    // 监听网络错误或CORS问题    xhr.onerror = function() {        callback('Network error or CORS issue');    };    xhr.send(); // 发送请求};

代码解析:

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

xhr.open(‘GET’, url, true): 配置请求。’GET’ 是HTTP方法,url 是API地址,true 表示请求是异步的。xhr.responseType = ‘json’: 告诉XHR期望服务器返回JSON格式的数据。这样,xhr.response 将自动被解析为JavaScript对象。xhr.onload: 当请求成功加载完成时触发。在这个回调中,我们检查 xhr.status 是否为 200(HTTP OK),然后调用传入的 callback 函数。xhr.onerror: 当请求遇到网络错误(如断网、CORS问题等)时触发。xhr.send(): 发送HTTP请求。

3. 在网页上显示天气数据

为了在网页上显示获取到的温度和天气描述,我们需要在HTML中准备相应的占位符元素。通常使用 标签并赋予唯一的 id。

            当前天气信息            body { font-family: Arial, sans-serif; margin: 20px; line-height: 1.6; }        #weather-display { border: 1px solid #e0e0e0; padding: 15px; border-radius: 8px; max-width: 350px; background-color: #f9f9f9; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }        #weather-display div { margin-bottom: 10px; display: flex; align-items: center; }        #weather-display strong { display: inline-block; width: 80px; color: #333; font-size: 1.1em; }        #temp, #weather-description { font-weight: bold; color: #007bff; font-size: 1.1em; }        h1 { color: #333; border-bottom: 2px solid #007bff; padding-bottom: 10px; margin-bottom: 20px; }        

当前天气信息

温度: 加载中...
描述: 加载中...
// getJSON 函数定义同上 const getJSON = function(url, callback) { let xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'json'; xhr.onload = function() { let status = xhr.status; if (status === 200) { callback(null, xhr.response); } else { callback(status); } }; xhr.onerror = function() { callback('Network error or CORS issue'); }; xhr.send(); }; // 您的API端点 const API_URL = 'https://mm214.com/jsondemo.php'; getJSON(API_URL, function(err, data) { const tempElement = document.getElementById("temp"); const weatherDescElement = document.getElementById("weather-description"); if (err) { console.error('获取天气数据失败:', err); if (tempElement) tempElement.innerHTML = '获取失败'; if (weatherDescElement) weatherDescElement.innerHTML = '获取失败'; alert('获取天气数据时发生错误: ' + err); } else { // 确保数据存在且结构正确 if (data && data.main && typeof data.main.temp !== 'undefined') { // 假设API返回开尔文温度,可根据需要转换为摄氏度或华氏度 if (tempElement) tempElement.innerHTML = data.main.temp + ' K'; } else { if (tempElement) tempElement.innerHTML = 'N/A'; } // weather是一个数组,通常第一个元素包含主要的天气描述 if (data && data.weather && data.weather.length > 0 && data.weather[0].description) { if (weatherDescElement) weatherDescElement.innerHTML = data.weather[0].description; } else { if (weatherDescElement) weatherDescElement.innerHTML = 'N/A'; } } });

关键点:

HTML结构: 两个 元素,分别用于显示温度 (id=”temp”) 和天气描述 (id=”weather-description”)。数据访问: 在 getJSON 的回调函数中,通过 data.main.temp 访问温度,通过 data.weather[0].description 访问天气描述。注意 weather 是一个数组,因此需要 [0] 来获取第一个天气对象。DOM更新: 使用 document.getElementById(“id”).innerHTML = value 将获取到的数据更新到对应的HTML元素中。健壮性: 在访问 data.main.temp 和 data.weather[0].description 之前,添加了对 data、data.main、data.weather 以及 data.weather.length 的存在性检查,以防止因API响应不完整或结构不符导致错误。温度单位: 示例中假定API返回的是开尔文温度,并添加了 ” K” 后缀。实际应用中,您可能需要将其转换为摄氏度或华氏度。

4. 注意事项与最佳实践

错误处理: 始终实现健壮的错误处理机制。在 getJSON 函数中,我们处理了HTTP状态码非200的情况以及网络错误。在回调函数中,也应该优雅地显示错误信息给用户,而不是让页面崩溃。

API密钥: 许多公共API需要API密钥进行认证。在本示例中,API不需要密钥,但在实际项目中,请确保妥善管理和保护您的API密钥(例如,不要直接暴露在前端代码中,而通过后端代理请求)。

异步性理解: AJAX请求是异步的。这意味着 getJSON 函数会立即返回,而数据处理逻辑会在请求完成后(即 callback 被调用时)执行。

跨域资源共享 (CORS): 如果您的网页与API位于不同的域,浏览器可能会阻止请求,出现CORS错误。这通常需要服务器端配置来允许跨域请求。

温度单位转换: 不同的天气API可能返回不同的温度单位(如开尔文、摄氏度、华氏度)。在显示之前,请确保进行必要的单位转换以符合用户预期。

现代替代方案: 尽管 XMLHttpRequest 功能强大,但现代JavaScript开发中更推荐使用 Fetch API 或第三方库如 Axios,它们提供了更简洁、更Promise化的API来处理HTTP请求。例如:

// 使用Fetch APIfetch(API_URL)    .then(response => {        if (!response.ok) {            throw new Error(`HTTP error! status: ${response.status}`);        }        return response.json();    })    .then(data => {        // 处理数据并更新DOM        document.getElementById("temp").innerHTML = data.main.temp + ' K';        document.getElementById("weather-description").innerHTML = data.weather[0].description;    })    .catch(error => {        console.error('获取天气数据失败:', error);        document.getElementById("temp").innerHTML = '获取失败';        document.getElementById("weather-description").innerHTML = '获取失败';    });

总结

通过本文,我们学习了如何使用原生JavaScript的 XMLHttpRequest 对象从API获取天气数据。关键在于理解API响应的JSON数据结构,特别是如何访问嵌套的对象属性和数组元素。通过清晰的HTML结构和JavaScript逻辑,我们可以轻松地将API数据动态地呈现在网页上,并结合错误处理和最佳实践,构建出健壮且用户友好的应用。虽然 XMLHttpRequest 是基础,了解现代的 Fetch API 也能帮助您编写更简洁高效的代码。

以上就是JavaScript原生AJAX实现天气API数据获取与展示:温度与描述的详细内容,更多请关注php中文网其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用CSS :empty 伪类高效隐藏无值的自定义字段及其样式
上一篇 2025年12月20日 13:41:58
JavaScript中计算二维坐标间距离:基于勾股定理的实现
下一篇 2025年12月20日 13:42:02

相关推荐

  • poki游戏在线网站 poki热门小游戏在线畅玩

    Poki热门小游戏包括《地铁跑酷》《愤怒的小鸟经典版》《Stick先生史诗般的生存》等,涵盖动作、体育、益智等多种类型,支持网页端免下载即玩,适配多设备,无需注册即可畅玩,定期更新并设有实时热门榜单,适合各年龄段玩家在线娱乐。 Poki游戏在线网站热门小游戏有哪些?这是不少网友都关注的,接下来由PH…

    2026年9月21日
    000
  • edge浏览器如何安装Chrome网上应用店的扩展_edge浏览器安装Chrome扩展方法

    答案:可通过四种方法在Edge浏览器中安装Chrome扩展。1、直接从Chrome网上应用店添加扩展,Edge会自动识别并安装;2、手动下载CRX或ZIP文件,通过开启开发者模式加载已解压的扩展程序;3、从Crx4Chrome等第三方平台下载兼容扩展并按手动方式安装;4、对扩展的manifest.j…

    2026年9月21日
    000
  • 如何在Java中实现简单的输入输出

    使用Scanner类读取键盘输入,需导入java.util.Scanner并创建实例;2. 调用nextInt、nextLine等方法获取不同类型数据,注意nextInt不读取换行符可能导致nextLine读取空字符串;3. 推荐使用后关闭Scanner;4. 输出通过System.out.prin…

    2026年9月21日
    000
  • 自定义组件(Component)的开发方法

    开发自定义组件的步骤包括:1. 使用html和css定义组件结构和样式;2. 用javascript实现动态效果和状态管理;3. 确保跨浏览器和设备兼容性;4. 采用模块化设计和外部状态管理工具;5. 进行性能优化和测试驱动开发。通过这些步骤,可以创建出优雅且高效的自定义组件,提升用户体验。 在开发…

    2026年9月21日
    000
  • Safari浏览器弹窗频繁怎么办 Safari浏览器弹窗拦截设置方法

    先设置全局拦截再允许特定网站弹窗。打开Safari设置→网站→弹出式窗口,将“访问其他网站时”设为“阻止”,再针对需使用弹窗的网站单独设为“允许”;iOS端在设置App中开启“阻止弹出式窗口”即可,必要时临时关闭。 如果你在使用 Safari 浏览器时被频繁弹窗打扰,可以按需设置全局或针对特定网站的…

    2026年9月21日
    000
  • VSCode的快捷键映射冲突怎么办?

    首先查看快捷键绑定情况,通过Ctrl+K再Ctrl+S打开键盘快捷方式界面,搜索目标键组合如Ctrl+Shift+P,查看并识别冲突命令;接着右键冲突命令选择“更改键绑定”设置新组合或删除多余绑定;为精确定位,可查看命令ID如workbench.action.quickOpen区分相似命令;若调整较…

    2026年9月21日
    000
  • 在Java中如何创建一个天气查询小应用

    注册OpenWeatherMap获取API密钥;2. 使用Java 11+的HttpClient发送HTTP请求;3. 构造带城市参数的URL并调用天气接口;4. 解析返回的JSON数据提取温度和天气描述;5. 在控制台输出结果,支持中文城市需URL编码。 在Java中创建一个天气查询小应用,核心是…

    2026年9月21日
    000
  • MAC怎么查询硬件序列号_Mac查找本机序列号与保修信息

    首先可通过“关于本机”查看Mac序列号,依次点击苹果菜单→“关于本机”即可获取;也可通过“系统信息”或“终端”命令ioreg -l | grep IOPlatformSerialNumber查找;若无法操作设备,可登录Apple ID账户在线查询;最后访问苹果官网保修查询页面输入序列号,即可验证保修…

    2026年9月21日
    200
  • Safari浏览器下载中断怎么办 Safari浏览器下载失败问题修复方法

    先检查下载状态和权限设置,确认网站未被限制下载;通过无痕模式测试排除缓存或插件干扰;清理部分下载文件并更换网络环境;最后更新系统以确保兼容性。 遇到 Safari 下载中断或失败,别急着重启电脑。先确认下载是否真的卡住,有时只是速度慢。点按浏览器右下角的“显示所有下载”按钮(箭头方框图标),查看列表…

    2026年9月21日
    300
  • Java字符串字符计数:避免substring()误用与==比较陷阱

    本文旨在解决java字符串字符计数中常见的陷阱,包括对`substring()`方法的误解、使用`==`进行字符串内容比较的错误以及循环边界条件的设置问题。通过深入解析`charat()`、`equals()`方法,并提供正确的代码示例和调试技巧,帮助开发者编写出高效、准确的字符串处理逻辑,避免初学…

    2026年9月21日
    100
  • 如何自定义代码的格式化规则?

    自定义代码格式化规则需选择合适工具并配置文件实现统一风格。1. 根据语言选用主流工具如Prettier、Black、clang-format等;2. 在项目根目录创建对应配置文件如.prettierrc、.eslintrc.js或pyproject.toml,定义缩进、引号、行宽等规则;3. 将配置…

    2026年9月21日
    100
  • mysql如何设置自动重连

    答案:通过连接配置、连接池和应用层逻辑实现MySQL自动重连。启用MYSQL_OPT_RECONNECT选项(旧版本),推荐使用连接池如PooledDB、HikariCP并配置ping机制,应用层捕获连接异常后重试,结合指数退避策略提升稳定性。 MySQL 客户端或应用程序在连接断开后无法自动恢复,…

    2026年9月21日
    100
  • Android Ksoap2序列化嵌套整数数组到.NET Web服务的解决方案

    本教程旨在解决Android Ksoap2在向.NET Web服务发送包含嵌套整数数组(如`ArrayList`)的自定义对象时遇到的序列化错误。核心解决方案包括将`ArrayList`替换为`Vector`,并为`Vector.class`添加显式Ksoap2类型映射,确保数据正确传输。 在And…

    2026年9月21日
    100
  • Java并发编程中CopyOnWriteArrayList使用场景

    CopyOnWriteArrayList适用于读多写少场景,通过写时复制实现线程安全,读操作无锁并发,迭代基于快照不抛异常,适合配置列表、监听器等数据变动少且需高性能读取的并发环境。 在Java并发编程中,CopyOnWriteArrayList 是一种线程安全的List实现,适用于读多写少的并发场…

    2026年9月21日
    100
  • 怎样在VSCode中快速生成注释文档?

    安装插件如Document This和Koro File Header,通过快捷键在VSCode中快速生成函数及文件注释,支持自定义模板,提升注释效率与规范性。 在 VSCode 中快速生成注释文档,主要依赖插件和快捷键配合代码语言特性来实现。不同编程语言支持方式略有差异,但核心思路是使用智能提示和…

    2026年9月21日
    200
  • edge浏览器打开速度越来越慢怎么回事_edge浏览器性能下降原因与优化方案

    Edge浏览器变慢时,可通过启用启动增强、禁用多余扩展、清除缓存数据、关闭硬件加速、重置设置或更新重装浏览器来优化性能。 如果您发现Edge浏览器的启动和页面加载速度明显变慢,而其他应用程序或浏览器运行正常,则问题很可能出在浏览器自身的设置、扩展程序或缓存数据上。以下是针对此问题的多种优化方案。 本…

    2026年9月21日
    100
  • Java中浮点数比较的陷阱:理解double类型的不精确性与正确比较方法

    java中`double`类型因其二进制浮点表示的固有不精确性,即使在相同java版本和架构下,也可能在不同环境中产生微小的数值差异。直接使用`==`比较浮点数是不可靠的,因为它无法容忍这些细微的舍入误差。正确的做法是采用基于容差(epsilon)的比较方法,通过判断两数之差的绝对值是否小于一个预设…

    2026年9月21日
    200
  • 如何下载豆包电脑网页版_豆包电脑网页版正版链接

    豆包AI电脑及网页版可通过官网和官方应用商店安全获取。1、访问https://www.doubao.com登录使用网页版;2、官网下载电脑客户端,支持Windows和macOS;3、通过Microsoft Store或App Store搜索“豆包 AI”,认准北京字节跳动网络技术有限公司开发,确保正…

    2026年9月21日
    200
  • 猎豹浏览器官方网址链接入口 猎豹浏览器平台直达访问官方主页

    猎豹浏览器官方网址是http://m.liebao.cn/?f=www,该网站提供极速浏览体验、个性化界面设置和实用功能整合,如双渲染引擎、安全防护、主题皮肤、广告过滤等。 猎豹浏览器官方网址链接入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来猎豹浏览器平台直达访问官方主页,感兴趣的网…

    2026年9月21日
    200
  • Java构造方法的执行顺序及注意事项

    构造方法执行顺序为:父类静态代码块→子类静态代码块→父类实例初始化块→父类构造方法→子类实例初始化块→子类构造方法,且super()必须位于子类构造方法首行。 Java构造方法的执行顺序涉及继承关系中父类与子类的初始化过程,理解这一流程对掌握对象创建机制非常重要。当创建一个子类对象时,JVM会自动确…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信