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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 13:41:58
下一篇 2025年12月20日 13:42:02

相关推荐

  • 使用CSS :empty 伪类高效隐藏无值的自定义字段及其样式

    本文介绍如何利用CSS的:empty伪类,在WordPress等动态内容网站中,实现对无值的自定义字段及其相关CSS样式的即时隐藏,避免页面加载时的闪烁问题,提升用户体验,并兼容缓存插件。 动态内容与空字段的挑战 在构建动态网站,特别是使用内容管理系统(如wordpress)时,自定义字段(cust…

    2025年12月20日
    000
  • 如何通过JavaScript的AudioContext合成声音,以及它如何生成和调制音频信号用于Web音频应用?

    AudioContext的核心组件包括AudioContext实例、源节点(如OscillatorNode)、效果节点(如GainNode、BiquadFilterNode)和目标节点(audioContext.destination),它们通过connect()方法连接成音频处理图。信号从源节点出…

    2025年12月20日
    000
  • 解决移动端reCAPTCHA弹出窗口定位问题的实用指南

    本教程旨在解决reCAPTCHA验证弹出窗口在移动设备上显示不全,特别是“验证”按钮不可见的问题。文章将深入探讨两种有效的CSS解决方案:利用position: fixed强制定位和使用max-height限制容器高度,确保reCAPTCHA在各种移动屏幕上都能正常显示和操作,提升用户体验。 reC…

    2025年12月20日
    000
  • React应用中集成与渲染独立静态内容的最佳实践

    本教程探讨了在React应用中集成现有HTML、CSS和JavaScript等静态内容的有效方法,避免了iFrame和代码重写。通过利用React项目的public目录,并将静态文件置于对应路径下,可以实现直接从React组件链接到这些内容,从而解决传统代码与现代React应用共存的问题,保持代码单…

    2025年12月20日
    000
  • 怎么使用JavaScript操作浏览器通知API?

    浏览器通知API的权限管理通过Notification.permission查看状态(default、granted、denied),调用Notification.requestPermission()请求授权,需在用户有感知的操作中触发以提升授予率,避免频繁打扰。 在JavaScript里,要操作…

    2025年12月20日
    000
  • 在React应用中集成并渲染遗留静态内容的策略

    本文探讨了在React应用中,如何在不使用iFrame且无需重写遗留静态代码(HTML、CSS、JS)的情况下,将其集成并渲染到特定路由。核心策略是利用React项目中的public目录来静态提供这些文件,并通过React组件中的链接进行访问,从而有效避免了代码重复和维护负担。 问题背景与挑战 在现…

    2025年12月20日
    000
  • 实现 UIKit Slider 强制向前(下一张)导航

    本教程旨在解决 UIKit Slider 在自定义导航场景中,当目标索引小于当前索引时,出现“向后”滑动而非预期“向前”滑动的问题。通过引入条件逻辑,判断目标索引与当前索引的关系,并结合 slider.show(‘next’) 方法,确保 Slider 始终保持从右向左的向前…

    2025年12月20日
    000
  • 前端工程化中的JavaScript编译原理

    前端工程化中的JavaScript编译核心是通过Babel等工具将现代语法转译为兼容性更好的代码,同时结合代码压缩、Tree Shaking、作用域提升、Polyfill注入和Source Map生成等优化手段,提升应用的性能、兼容性和开发体验。 前端工程化中的JavaScript编译原理,在我看来…

    2025年12月20日
    000
  • Web Animations API:持久化动画结束后的元素样式

    当使用Web Animations API时,Animation.commitStyles() 常常无法在动画结束后持久化样式,因为动画默认的 fill 属性为 none。本文将详细解释这一现象,并提供一种高效且推荐的方法:结合 fill: “forwards” 属性、com…

    2025年12月20日
    000
  • JS 代码静态分析工具 – 使用 ESLint 定制团队专属的校验规则

    答案:通过ESLint可实现JS代码静态分析,统一团队编码规范。首先选择合适规则集或自定义配置,结合团队风格逐步调整;利用AST原理编写自定义规则,如禁止console.log;通过培训和试点项目推广实施,融入CI/CD流程,定期评审更新规则,保持配置简洁可维护,提升代码质量与开发效率。 JS 代码…

    2025年12月20日
    000
  • 利用CSS :empty 伪类优雅隐藏WordPress空值自定义字段

    本教程详细探讨了如何在WordPress中优雅地处理无值的自定义字段显示问题。针对空值字段仍显示其CSS样式,甚至出现闪烁的现象,文章提出了利用CSS :empty 伪类进行彻底隐藏的解决方案。同时,也讨论了结合PHP进行服务器端条件渲染的更优实践,以确保页面加载时仅显示有内容的自定义字段,从而提升…

    2025年12月20日
    000
  • 如何通过JavaScript实现滚动加载更多?

    答案是通过监听滚动事件并判断是否接近底部来触发加载,需结合节流、预加载、错误处理和防重复请求等策略优化体验。 通过JavaScript实现滚动加载更多,核心在于监听滚动事件,判断是否滚动到底部,然后动态加载新的内容。这听起来简单,但实际操作中有很多细节需要考虑。 解决方案 监听滚动事件: 使用 ad…

    2025年12月20日
    000
  • 隐藏无值自定义字段及其CSS样式:利用CSS :empty 伪类实现

    本教程旨在解决自定义字段无值时仍显示其CSS样式的问题。通过采用CSS的:empty伪类,可以直接在样式层面控制空元素的显示,从而避免页面加载时的闪烁和与客户端JavaScript及缓存插件的潜在冲突,实现更高效、稳定的内容展示。 问题背景:空自定义字段的显示困扰 在网页开发中,尤其是在使用内容管理…

    2025年12月20日
    000
  • JavaScript onclick 事件中传递字符串参数的常见陷阱与最佳实践

    本文深入探讨了在JavaScript onclick 事件中直接传递字符串参数时,由于未正确引用而导致的 SyntaxError 问题。我们将分析错误原因,提供两种解决方案:一是通过手动添加引号来修复内联事件处理器,二是推荐使用 addEventListener 这种更健壮、可维护的事件绑定机制,并…

    2025年12月20日
    000
  • 如何通过JavaScript实现表单序列化?

    表单序列化是将表单数据转换为服务器可识别格式(如URL编码字符串或JSON)的过程。通过遍历表单元素,提取name和value,处理不同元素类型(如单选框、复选框、多选下拉框),排除禁用或无name属性的元素,最终生成结构化数据。原生JavaScript可通过遍历和条件判断实现,而现代开发推荐使用F…

    2025年12月20日
    000
  • 控制 UIKit Slider 实现单向“下一页”导航

    本教程将指导您如何优化 UIKit Slider 的自定义导航行为,确保在无限循环滑块中始终以“下一页”方向(从右到左)进行切换,即使目标索引小于当前索引。通过判断目标幻灯片索引与当前索引的关系,并结合 slider.show() 方法的灵活使用,实现流畅且符合预期的单向导航体验。 理解 UIKit…

    2025年12月20日
    000
  • FullCalendar v3.x 数据库变更后事件刷新指南

    本文旨在解决FullCalendar v3.x版本中,如何在后端数据库事件数据发生变更后,动态刷新前端日历事件的常见问题。通过详细讲解addEventSource方法的正确用法,特别是其第二个参数true的作用,提供示例代码并强调版本兼容性,帮助开发者实现高效、准确的日历事件更新。 FullCale…

    2025年12月20日
    000
  • JavaScript中计算二维坐标点之间距离的教程

    本教程详细介绍了如何在JavaScript中计算两个二维坐标点之间的最短距离。通过应用勾股定理(欧几里得距离公式),我们将展示如何使用简单的数学运算和JavaScript内置函数实现高效且准确的距离计算,并提供示例代码和使用注意事项,帮助开发者轻松解决此类问题。 理解欧几里得距离 在二维平面上,计算…

    2025年12月20日
    000
  • JS 数据持久化方案 – 离线存储与同步策略的实现思路解析

    JS数据持久化方案包括Cookie、LocalStorage、SessionStorage、IndexedDB、Cache API和Service Worker,各有适用场景。Cookie容量小且影响性能,适合存简单偏好;LocalStorage容量大、安全性好,适合存储用户配置等客户端数据;Ses…

    2025年12月20日
    000
  • 如何通过navigator对象检测客户端环境,以及这些信息在跨设备兼容性处理中的可靠性如何?

    navigator对象可用于检测客户端环境,但其属性如userAgent、platform和language可靠性有限,易被篡改或存在不一致;推荐优先使用特性检测判断API支持情况,并结合navigator信息辅助分析,以提高检测准确性。 navigator对象是浏览器提供的一个接口,它包含了关于浏…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信