Показать сообщение отдельно
  #4 (permalink)  
Старый 21.12.2022, 00:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

погода api openweathermap
Сообщение от parshin
weather.icon; weather.description; почему то выводят undefined.
.
data.weather это массив,
нужно указать индекс нужного элемента.
Сообщение от parshin
появляется только после 1-го обновления через минуту
нарушена логика, сначала идёт обработка данных, а потом запрос этих данных, для первого показа нечего обрабатывать.
- а надо, получили данные, затем их обработали.
<!DOCTYPE html>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
</head>

<body>
    <div id="w_out"></div>
    <script>
        /* global w_out */

        var city2, w_ico, w_des, temp, f_l, pressure, w_d, wind, humidity, visibility, sunrise, sunset, set_rise, t_z;
        var data;
        let apiKey = "45aef403d21cba00f8464647a9595250";
        let city = "Perm";
        let url = `http://api.openweathermap.org/data/2.5/weather?q=${city}&lang=ru&units=metric&appid=${apiKey}`;

        function getFile(fileName) {
            var request = new XMLHttpRequest();
            request.open('GET', fileName);
            request.onloadend = function() {
                parse(request.responseText);
                weather();
            };
            request.timeout = 5000;
            request.send();
        };

        function parse(obj) {
            data = JSON.parse(obj);
            city2 = data.name;
            w_ico = data.weather[0].icon;
            w_des = data.weather[0].description;
            temp = data.main.temp;
            f_l = data.main.feels_like;
            pressure = data.main.pressure * 0.750063755419211;
            w_d = data.wind.deg;
            wind = data.wind.speed;
            humidity = data.main.humidity;
            visibility = data.visibility;
            sunrise = data.sys.sunrise;
            sunset = data.sys.sunset;
            set_rise = sunset - sunrise;
            t_z = data.timezone;
        }

        function weather() {
            const sec = 1000;
            const min = 60 * sec;
            const hour = 60 * min;
            const delay = (0 * hour) + (1 * min) + (0 * sec);
            var w_url = "http://pmm.h1n.ru/weather/images/";
            //if (pg === 1) w_url = "images/";
            var d = new Date();
            var month_num = d.getMonth();
            var week_num = d.getDay();
            var day = d.getDate();
            var hours = d.getHours();
            var minutes = d.getMinutes();
            var seconds = d.getSeconds();
            month = new Array("января", "февраля", "марта", "апреля", "мая", "июня",
                "июля", "августа", "сентября", "октября", "ноября", "декабря");
            week = new Array("воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота");
            if (day <= 9) day = "0" + day;
            if (hours <= 9) hours = "0" + hours;
            if (minutes <= 9) minutes = "0" + minutes;
            if (seconds <= 9) seconds = "0" + seconds;


            temp = Math.round(temp);
            f_l = Math.round(f_l);
            pressure = Math.round(pressure);
            h1 = Math.floor(set_rise / 3600);
            set_rise = set_rise - h1 * 3600;
            m1 = Math.floor(set_rise / 60);
            if (h1 < 10) h1 = "0" + h1;
            if (m1 < 10) m1 = "0" + m1;
            set_rise = h1 + ":" + m1;
            y1 = Math.floor(sunrise / (3600 * 24 * 365));
            sunrise = sunrise - y1 * (3600 * 24 * 365);
            d1 = Math.floor(sunrise / (3600 * 24));
            sunrise = sunrise - d1 * (3600 * 24) + t_z;
            h1 = Math.floor(sunrise / 3600);
            sunrise = sunrise - h1 * 3600;
            m1 = Math.floor(sunrise / 60);
            if (h1 < 10) h1 = "0" + h1;
            if (m1 < 10) m1 = "0" + m1;
            sunrise = h1 + ":" + m1;
            y1 = Math.floor(sunset / (3600 * 24 * 365));
            sunset = sunset - y1 * (3600 * 24 * 365);
            d1 = Math.floor(sunset / (3600 * 24));
            sunset = sunset - d1 * (3600 * 24) + t_z;
            h1 = Math.floor(sunset / 3600);
            sunset = sunset - h1 * 3600;
            m1 = Math.floor(sunset / 60);
            if (h1 < 10) h1 = "0" + h1;
            if (m1 < 10) m1 = "0" + m1;
            sunset = h1 + ":" + m1;
            if (((w_d >= 351) && (w_d <= 360)) || ((w_d >= 0) && (w_d <= 11))) w_d = "северный";
            if (((w_d >= 12) && (w_d <= 34))) w_d = "северо-северо-восточный";
            if (((w_d >= 35) && (w_d <= 56))) w_d = "северо-восточный";
            if (((w_d >= 57) && (w_d <= 80))) w_d = "восточно-северо-восточный";
            if (((w_d >= 81) && (w_d <= 102))) w_d = "восточный";
            if (((w_d >= 103) && (w_d <= 125))) w_d = "восточно-юго-восточный";
            if (((w_d >= 126) && (w_d <= 148))) w_d = "юго-восточный";
            if (((w_d >= 149) && (w_d <= 170))) w_d = "юго-юго-восточный";
            if (((w_d >= 171) && (w_d <= 193))) w_d = "южный";
            if (((w_d >= 194) && (w_d <= 215))) w_d = "юго-юго-западный";
            if (((w_d >= 216) && (w_d <= 238))) w_d = "юго-западный";
            if (((w_d >= 239) && (w_d <= 260))) w_d = "западно-юго-западный";
            if (((w_d >= 261) && (w_d <= 283))) w_d = "западный";
            if (((w_d >= 284) && (w_d <= 305))) w_d = "западно-северо-западный";
            if (((w_d >= 306) && (w_d <= 328))) w_d = "северо-западный";
            if (((w_d >= 329) && (w_d <= 350))) w_d = "северо-северо-западный";

            date_time = '<div class="weather" style="text-align: center;height: 290px;width: 350px;border-style: outset; border-width: 5px; background-color:#000000;">' +
                '<table width="100%" height="100%" cellspasing="0" cellpadding="0">' +
                '<tr><td nowrap style="width: 100%;height: 100%background-size: cover;background-image: url(' + w_url + 'fon0.gif)">' +
                '<font style="font-size: 18pt;text-align: center;font-weight: bold" color="#00FFFF">' +
                '<p style="margin-bottom: 10px;margin-top: 2px">' + city2 + '</p>' +
                '</font>' +
                '<p style="margin-bottom: 2px;margin-top: 2px;text-align: center"><font style="font-size: 14pt; color: #FFFFFF">' + week[week_num] +
                '<br>' + day + ' ' + month[month_num] + ' ' + d.getFullYear() + '</font>' +
                '<font face="LcdD" style="font-size: 14pt;font-style: normal; color: #00FF66"> ' + hours + ':' + minutes + '</font></p>' +
                '<font style="font-size: 13pt" color="#FFFFFF">' +
                '<p style="margin-bottom: 2px;margin-top: 2px;margin-left: 10px;text-align: left">Погода: ' +
                '<img width="32" height="32" src="' + w_url + w_ico + '.png" alt=""><font color="#FFFF00"> ' + w_des + '</font><br>' +
                'Температура: <font color="#FFFF00">' + temp + '°C&nbsp;&nbsp;&nbsp;<font color="#FFFFFF"> По ощущению </font>' + f_l + '°C</font></p>' +
                '<p style="margin-bottom: 2px;margin-top: 2px;margin-left: 10px;text-align: left">Давление: <font color="#FFFF00">' + pressure + ' мм рт. ст.</font></p>' +
                '<p style="margin-bottom: 2px;margin-top: 2px;margin-left: 10px;text-align: left">Ветер: <font color="#FFFF00">' + w_d + ' ' + wind + ' м/с</font></p>' +
                '<p style="margin-bottom: 2px;margin-top: 2px;margin-left: 10px;text-align: left">Влажность: <font color="#FFFF00">' + humidity + '%</font></p>' +
                '<p style="margin-bottom: 2px;margin-top: 2px;margin-left: 10px;text-align: left">Видимость: <font color="#FFFF00">' + visibility + ' м</font></p>' +
                '<img src="' + w_url + '01d.png" width="48" height="48" alt="" align="left">' +
                '<p style="margin-bottom: 2px;margin-top: 2px;margin-left: 10px;text-align: left">Рассвет: <font color="#FFFF00">' + sunrise + '<font color="#FFFFFF">&nbsp;&nbsp;&nbsp;Долгота дня </font>' + set_rise + '</font></p>' +
                '<p style="margin-bottom: 2px;margin-top: 2px;margin-left: 10px;text-align: left">Закат: <font color="#FFFF00">' + sunset + '</font></p>' +
                '</font></td></tr></table></div>';
            w_out.innerHTML = date_time;
            setTimeout(() => getFile(url), delay);
        }
         document.addEventListener("DOMContentLoaded", function() {
         getFile(url);
                    })

    </script>
</body>

</html>

Последний раз редактировалось рони, 21.12.2022 в 00:04.
Ответить с цитированием