-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathindex.js
109 lines (91 loc) · 3.67 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
const container = document.querySelector('.container');
const search = document.querySelector('.search-box button');
const weatherBox = document.querySelector('.weather-box');
const weatherDetails = document.querySelector('.weather-details');
const error404 = document.querySelector('.not-found');
const input = document.querySelector('.search-box input');
const APIKey = '303b7ad4afd79c0daf56c9c1ebab4512';
document.addEventListener('keyup', (e) => {
if (e.key === 'Enter') {
getWeather();
}
});
search.addEventListener('click', () => {
getWeather();
});
async function fetchWeather(city) {
try {
const response = await fetch(`https://api.openweathermap.org/data/2.5/weather?q=${city}&units=metric&appid=${APIKey}`);
if (!response.ok) {
if (response.status === 404) {
return { cod: '404' };
}
throw new Error("API Issue");
}
return await response.json();
} catch (error) {
console.error("Error fetching weather data:", error);
return null;
}
}
function updateWeatherDetails(json) {
const cityName = document.querySelector('.city-name');
const image = document.querySelector('.weather-box img');
const temperature = document.querySelector('.weather-box .temperature');
const description = document.querySelector('.weather-box .description');
const humidity = document.querySelector('.weather-details .humidity span');
const wind = document.querySelector('.weather-details .wind span');
const pollution = document.querySelector('.weather-details .pollution span');
const coords = document.querySelector('.weather-details .coords span');
cityName.textContent = `${json.name}, ${json.sys.country}`;
const weatherImages = {
'Clear': 'images/clear.png',
'Rain': 'images/rain.png',
'Snow': 'images/snow.png',
'Clouds': 'images/cloud.png',
'Haze': 'images/mist.png'
};
image.src = weatherImages[json.weather[0].main] || '';
temperature.innerHTML = `${parseInt(json.main.temp)}<span>°C</span>`;
description.innerHTML = `${json.weather[0].description}`;
humidity.innerHTML = `${json.main.humidity}%`;
wind.innerHTML = `${parseInt(json.wind.speed)}km/h`;
pollution.innerHTML = `114514`;
const showCoords = (lat, lon) =>
`${Math.abs(lat)}°${lat >= 0 ? 'N' : 'S'}
${Math.abs(lon)}°${lon >= 0 ? 'E' : 'W'}`;
coords.innerHTML = showCoords(Math.floor(json.coord.lat), Math.floor(json.coord.lon));
// Reset animation classes
weatherBox.style.display = 'none';
weatherDetails.style.display = 'none';
weatherBox.classList.remove('fadeIn');
weatherDetails.classList.remove('fadeIn');
// Trigger reflow to restart the animation
void weatherBox.offsetWidth;
void weatherDetails.offsetWidth;
weatherBox.style.display = '';
weatherDetails.style.display = '';
weatherBox.classList.add('fadeIn');
weatherDetails.classList.add('fadeIn');
container.style.height = '590px';
}
async function getWeather() {
const city = input.value;
if (city === '') return;
const weatherData = await fetchWeather(city);
if (weatherData && weatherData.cod === '404') {
container.style.height = '400px';
weatherBox.style.display = 'none';
weatherDetails.style.display = 'none';
error404.style.display = 'block';
error404.classList.add('fadeIn');
input.value = ''; // 清空输入框
return;
}
error404.style.display = 'none';
error404.classList.remove('fadeIn');
if (weatherData) {
updateWeatherDetails(weatherData);
input.value = ''; // 清空输入框
}
}