<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
.container {
max-width: 500px;
margin: 50px auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 10px;
}
.input-group {
margin-bottom: 20px;
}
input {
padding: 8px;
width: 200px;
margin-right: 10px;
}
button {
padding: 8px 16px;
cursor: pointer;
}
.weather-box {
margin-top: 20px;
padding: 15px;
border: 1px dashed #666;
border-radius: 5px;
}
.error {
color: #f00;
}
.loading {
color: #666;
}
/*.weather-img{
width: 24px;
height: 24px;
}*/
</style>
</head>
<body>
<div class="container">
<h2>城市天气查询</h2>
<div class="input-group">
<input type="text" id="city" placeholder="请输入城市(上海)" />
<button onclick="queryWeather()">查询</button>
</div>
<div id="result" class="weather-box"></div>
</div>
</body>
<script type="text/javascript">
// 1.定义appkey
const APP_KEY = "585BE81052C14bF6A030Dec5c246c498"
// 2.API地址
const API_URL = "https://route.showapi.com/9-2"
// 3.查询天气函数
async function queryWeather() {
const city = document.getElementById("city").value.trim();
const resultDom = document.getElementById("result");
//校验输入
if(!city) {
resultDom.innerHTML = "<p class='error'>请输入城市名称</p>"
return;
}
//显示加载状态
resultDom.innerHTML = "<p class='loading'>查询中...</p>"
try {
//4.构造请求参数
const params = new URLSearchParams({
appKey: APP_KEY, // 核心:传递appKey作为认证参数
area: city, // 城市参数(以文档要求为准)
// 其他可选参数(如日期、天数,根据API文档添加)
needIndex: 1
})
//5.调用api
const response = await fetch(`${API_URL}?${params}`);
const data = await response.json();
//6.解析返回数据
//假设API成功返回时code为0,具体以文档为主
if(data.showapi_res_code === 0) {
//主要函数
const weatherInfo = data.showapi_res_body //主体数据
const today = weatherInfo.f1 //当天天气
const weatherText = today.day_weather || "未知"
const weatherImg = weatherImgMap[weatherText] || ""
//拼接展示函数
resultDom.innerHTML = `
<p>城市:${weatherInfo.cityInfo.c3}</p>
<p>日期:${today.day}</p>
<p>天气:<img src="${weatherImg}" class="weather-img">${weatherText}</p>
<p>化妆指数:${today.index.beauty.title}</p>
<p>穿衣指数:${today.index.clothes.title}</p>
<p>舒适度:${today.index.comfort.title}</p>
<p>防感冒建议:${today.index.cold.title}</p>
<p>温度:${today.day_air_temperature}</p>
<p>风向:${today.night_wind_direction}</p>
<p>日出日落时间:${today.sun_begin_end}</p>`
} else {
//API返回错误信息
resultDom.innerHTML = `<p class='error'>错误:${data.showapi_res_error || "查询失败"}</p>`
}
} catch(error) {
//网络错误
resultDom.innerHTML = `<p class='error'>网路错误:${error.message}</p>`
}
}
//定义天气图标的图谱
const weatherImgMap = {
晴: "img/晴.png",
大雨: "img/大雨.png",
小雨: "img/小雨.png",
雷阵雨: "img/雷阵雨.png",
阴: "img/阴天.png",
多云: "img/多云.png",
雪: "img/雪.png"
}
//页面加载时默认查询
window.onload = queryWeather
</script>