You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript请求国旗API并通过img src显示?加载失败求助

问题排查与修复方案

我帮你找出了几个导致图片无法显示的核心问题,咱们逐一解决:

1. 数组索引不匹配(最致命的错误)

在add_name.html里,你往数组里添加的是4个元素:名字、姓氏、生日、国家。但在personInfo.html中,你却用item[4]去获取国家——要知道数组索引是从0开始的,你的数组只有item[0]到item[3],item[4]会返回undefined。把这个值拼到API URL里,就会变成https://www.countryflags.io/undefined/shiny/64.png,自然加载不出图片。

修复:把personInfo.html里所有的item[4]替换成item[3]。

2. JavaScript不支持Python的.format()字符串方法

你写的'https://www.countryflags.io/{}/shiny/64.png'.format(item[4])是Python的写法,JavaScript里没有这个内置方法,这会直接抛出语法错误,导致后续代码完全无法执行。

修复:改用JavaScript的模板字符串(用反引号`包裹,变量用${变量}插入),这是JS里最简洁的字符串拼接方式:

const flagUrl = `https://www.countryflags.io/${item[3]}/shiny/64.png`;

3. 不必要的Fetch请求+错误的JSON解析

你完全不需要用fetch去请求图片——浏览器只要拿到图片URL,设置img的src属性就会自动加载图片。而且图片是二进制数据,你调用response.json()会直接抛出错误,进入catch块,影响代码执行流程。

修复:删掉整个Fetch逻辑,直接设置图片的src即可。

4. 初始img标签的无效src

你的img标签初始写的是<img id="countryFlag" src = country_flag; />,这里的country_flag是未定义的变量,会导致页面加载时就显示破碎的图片占位符。

修复:把初始src设为空,加上alt属性提升可访问性:

<img id="countryFlag" src="" alt="Country Flag" />

修正后的关键代码片段

personInfo.html 修改后的脚本部分

<div class="block">
<label>Some facts about country: </label>
<img id="countryFlag" src="" alt="Country Flag" />
</div>
<script>
var personInfoList = JSON.parse(sessionStorage.getItem("newList1"));
for(let item of personInfoList) {
    document.getElementById("displayName").innerHTML = item[0] + " " + item[1];
    document.getElementById("birthdate").innerHTML = item[2];
    document.getElementById("country").innerHTML = item[3];
    
    // 直接生成正确的国旗URL并设置
    const flagUrl = `https://www.countryflags.io/${item[3]}/shiny/64.png`;
    const flagImg = document.getElementById("countryFlag");
    flagImg.src = flagUrl;
    
    // 可选:添加错误监听,当国家名称/代码无效时显示占位图
    flagImg.addEventListener('error', function() {
        this.src = 'https://www.countryflags.io/unknown/shiny/64.png';
    });
}
</script>

add_name.html 额外小修复

你在获取历史数据时用了localStorage.getItem("newList1"),但存储时用的是sessionStorage.setItem,这会导致页面刷新后数据丢失。建议统一存储方式,把localStorage.getItem改成sessionStorage.getItem:

function passVal() {
    var prevValue = sessionStorage.getItem("newList1"); // 这里改成sessionStorage
    var newList = prevValue ? JSON.parse(prevValue) : [];
    var newFirstName = document.getElementById("firstname").value;
    var newLastName = document.getElementById("lastname").value;
    var newBirthday = document.getElementById("birthday").value;
    var newCOO = document.getElementById("countryOfOrigin").value;
    newList.push([newFirstName, newLastName, newBirthday, newCOO]);
    sessionStorage.setItem("newList1", JSON.stringify(newList));
}

额外提示

countryflags.io的API支持ISO 3166国家代码(如US、CN)或标准英文国家名称(如United States),如果用户输入的是其他格式(比如中文名称),可能还是会加载失败。可以在输入页面提示用户输入正确的国家代码或英文名称。

内容的提问来源于stack exchange,提问作者IfBirdsFlySoDoI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:43:15