0

0

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

心靈之曲

心靈之曲

发布时间:2025-09-19 14:48:01

|

463人浏览过

|

来源于php中文网

原创

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。




    
    
    当前天气信息
    



    

当前天气信息

温度: 加载中...
描述: 加载中...

关键点:

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

4. 注意事项与最佳实践

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

    Beautiful.ai
    Beautiful.ai

    AI在线创建幻灯片

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

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

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

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

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

    // 使用Fetch API
    fetch(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 也能帮助您编写更简洁高效的代码。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2882

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1704

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1560

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1078

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1525

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1277

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1649

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1309

2023.11.13

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 10.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号