JS调用OpenWeatherMap 5天预报循环填充多卡片仅单个生效求助
故障根因
- DOM选择器拼接规则完全错位
你在循环里直接把3小时间隔预报数组的原始索引(0、8、16、24、32)作为id后缀拼接选择器,和页面上5张天气卡片的id规则不匹配。
通常页面上的5张卡片会按顺序设置id为date0/date1/date2/date3/date4,对应第1到第5天的展示位。但你拼出来的选择器是#date0、#date8、#date16、#date24、#date32,其中只有#date0能匹配到第一张卡片,剩下四个选择器指向的DOM节点根本不存在,后续循环拿到的预报数据无法写入对应卡片,最终表现就是所有内容只堆在了第一个匹配到的卡片上。 - 循环计数器未做作用域声明
for循环里的i没有加let/var声明,会变成全局作用域变量,极易和其他脚本的变量命名冲突,引发不可预期的逻辑错误。 - 温度计算存在小误差
代码里用开尔文温度减273.5做转换基准,实际标准转换基准为273.15,长期累计会带来可感知的温度数值偏差。
修正方案
单独维护一个从0开始递增的卡片序号,把每间隔8条提取的自然日预报数据,和顺序排列的5个卡片做一一映射,不再直接拿数组的大索引当DOM id后缀。修正后的代码如下:
function forecast(cityID) { let fiveDayForecastAPI = `http://api.openweathermap.org/data/2.5/forecast?q=${cityID}&appid=${myAPI}`; fetch(fiveDayForecastAPI) .then(response => response.json()) .then(data => { const forecastList = data.list; let cardIndex = 0; // 按步长8遍历,每8条对应一个自然日 for (let i = 0; i < forecastList.length; i += 8) { // 最多填充5张卡片,避免越界 if (cardIndex > 4) break; const timestamp = forecastList[i].dt * 1000; const dateStr = new Date(timestamp).toLocaleDateString(); const iconCode = forecastList[i].weather[0].icon; const iconUrl = `https://openweathermap.org/img/wn/${iconCode}.png`; const tempKelvin = forecastList[i].main.temp; // 修正开尔文转华氏度的计算逻辑 const tempF = ((tempKelvin - 273.15) * 1.8 + 32).toFixed(2); const humidity = forecastList[i].main.humidity; // 按卡片顺序序号拼接选择器,匹配实际DOM节点 $(`#date${cardIndex}`).text(dateStr); $(`#img${cardIndex}`).html(`<img src="${iconUrl}">`); $(`#temp${cardIndex}`).text(` ${tempF} F`); $(`#humidity${cardIndex}`).text(` ${humidity}%`); cardIndex++; } }); }
验证注意点
- 调试时可在循环里打印拼出的选择器对应的DOM对象,确认每次循环都能匹配到非空的节点,避免因id拼写、层级问题导致的选择失效。
- 提前检查页面上的5个卡片内的元素id,确保日期、图标、温度、湿度模块的id后缀为0、1、2、3、4,和代码的拼接规则一致。
内容的提问来源于stack exchange,提问作者Kurtis Jin
相关产品推荐
相关产品推荐

