点击按钮调用汇率API获取对应国家汇率的JS代码求助
问题排查:汇率计算JavaScript代码无法运行
需求是点击表单的「calculate」按钮(id为country_currency_form_button)时:
- 获取下拉框(id为
select_country2)选中的国家名称 - 通过匹配逻辑将国家名转为对应货币代码
- 调用汇率API获取美元(USD)与目标货币的实时汇率,显示在id为
rates的<p>标签中
但当前代码无法正常运行,原代码如下:
<p>The exchange rate is: </p> <p id="rates"></p> <script> document.getElementById('country_currency_form_button').onclick = function() { var country2select = document.getElementById("select_country2"); var countryCheck = country2select.options[country2select.selectedIndex].text; } var countryCheckCurrency; //check country name and assign currency code if (countryCheck === "Albania") { countryCheckCurrency = "LEK"; } else if (countryCheck === "Andorra") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Austria") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Belarus") { countryCheckCurrency = "BYN"; } else if (countryCheck === "Belgium") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Bosnia and Herzegovina") { countryCheckCurrency = "BAM"; } else if (countryCheck === "Bulgaria") { countryCheckCurrency = "BGN"; } else if (countryCheck === "Croatia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Czech Republilc") { countryCheckCurrency = "CZK"; } else if (countryCheck === "Denmark") { countryCheckCurrency = "DKK"; } else if (countryCheck === "Estonia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Finland") { countryCheckCurrency = "EUR"; } else if (countryCheck === "France") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Germany") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Greece") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Hungary") { countryCheckCurrency = "HUF"; } else if (countryCheck === "Iceland") { countryCheckCurrency = "ISK"; } else if (countryCheck === "Ireland") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Italy") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Latvia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Liechtenstein") { countryCheckCurrency = "CHF"; } else if (countryCheck === "Lithuania") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Luxembourg") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Malta") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Moldova") { countryCheckCurrency = "MDL"; } else if (countryCheck === "Monaco") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Montenegro") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Netherlands") { countryCheckCurrency = "EUR"; } else if (countryCheck === "North Macedonia") { countryCheckCurrency = "MKD"; } else if (countryCheck === "Norway") { countryCheckCurrency = "NOK"; } else if (countryCheck === "Poland") { countryCheckCurrency = "PLN"; } else if (countryCheck === "Portugal") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Romania") { countryCheckCurrency = "RON"; } else if (countryCheck === "San Marino") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Serbia") { countryCheckCurrency = "RSD"; } else if (countryCheck === "Slovakia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Slovenia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Spain") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Sweden") { countryCheckCurrency = "SEK"; } else if (countryCheck === "Switzerland") { countryCheckCurrency = "CHF"; } else if (countryCheck === "Ukraine") { countryCheckCurrency = "UAH"; } else if (countryCheck === "United Kingdom") { countryCheckCurrency = "GBP"; } //if the country is anything else else { countryCheckCurrency = "UNKNOWN"; } let w = "USD"; let x = countryCheckCurrency; //now we do the API request var requestURL = 'https://api.exchangerate.host/convert?from=' + w + "&to=" + x; var request = new XMLHttpRequest(); request.open('GET', requestURL); request.responseType = 'json'; request.send(); request.onload = function() { var response = request.response; console.log(response); } //and display the rate in the relevant paragraph document.getElementById("rates").innerHTML = response.result; </script>
问题分析
- 变量作用域错误:
countryCheck定义在点击事件的回调函数内部,外部的匹配逻辑无法访问该变量,导致countryCheckCurrency始终是undefined或UNKNOWN。 - 异步请求处理错误:XMLHttpRequest是异步操作,在调用
request.send()后直接执行document.getElementById("rates").innerHTML = response.result时,API响应还未返回,response未定义会报错。 - 拼写错误:代码中
Czech Republilc多写了一个l,应该是Czech Republic,会导致捷克的货币代码匹配失败。 - 未处理无效货币情况:如果匹配到
UNKNOWN货币,调用API会返回错误,没有对应的错误处理逻辑。
修复后的代码
<p>The exchange rate is: </p> <p id="rates"></p> <script> document.getElementById('country_currency_form_button').onclick = function() { const country2select = document.getElementById("select_country2"); const countryCheck = country2select.options[country2select.selectedIndex].text; let countryCheckCurrency; // 国家-货币匹配逻辑 if (countryCheck === "Albania") { countryCheckCurrency = "LEK"; } else if (countryCheck === "Andorra") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Austria") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Belarus") { countryCheckCurrency = "BYN"; } else if (countryCheck === "Belgium") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Bosnia and Herzegovina") { countryCheckCurrency = "BAM"; } else if (countryCheck === "Bulgaria") { countryCheckCurrency = "BGN"; } else if (countryCheck === "Croatia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Czech Republic") { // 修正拼写错误 countryCheckCurrency = "CZK"; } else if (countryCheck === "Denmark") { countryCheckCurrency = "DKK"; } else if (countryCheck === "Estonia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Finland") { countryCheckCurrency = "EUR"; } else if (countryCheck === "France") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Germany") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Greece") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Hungary") { countryCheckCurrency = "HUF"; } else if (countryCheck === "Iceland") { countryCheckCurrency = "ISK"; } else if (countryCheck === "Ireland") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Italy") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Latvia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Liechtenstein") { countryCheckCurrency = "CHF"; } else if (countryCheck === "Lithuania") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Luxembourg") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Malta") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Moldova") { countryCheckCurrency = "MDL"; } else if (countryCheck === "Monaco") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Montenegro") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Netherlands") { countryCheckCurrency = "EUR"; } else if (countryCheck === "North Macedonia") { countryCheckCurrency = "MKD"; } else if (countryCheck === "Norway") { countryCheckCurrency = "NOK"; } else if (countryCheck === "Poland") { countryCheckCurrency = "PLN"; } else if (countryCheck === "Portugal") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Romania") { countryCheckCurrency = "RON"; } else if (countryCheck === "San Marino") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Serbia") { countryCheckCurrency = "RSD"; } else if (countryCheck === "Slovakia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Slovenia") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Spain") { countryCheckCurrency = "EUR"; } else if (countryCheck === "Sweden") { countryCheckCurrency = "SEK"; } else if (countryCheck === "Switzerland") { countryCheckCurrency = "CHF"; } else if (countryCheck === "Ukraine") { countryCheckCurrency = "UAH"; } else if (countryCheck === "United Kingdom") { countryCheckCurrency = "GBP"; } else { countryCheckCurrency = "UNKNOWN"; } const ratesElement = document.getElementById("rates"); // 处理无效货币情况 if (countryCheckCurrency === "UNKNOWN") { ratesElement.innerHTML = "无法识别该国家的货币"; return; } // 发起API请求 const requestURL = `https://api.exchangerate.host/convert?from=USD&to=${countryCheckCurrency}`; const request = new XMLHttpRequest(); request.open('GET', requestURL); request.responseType = 'json'; request.onload = function() { if (request.status >= 200 && request.status < 300) { const response = request.response; if (response.success) { ratesElement.innerHTML = `${response.result.toFixed(4)} ${countryCheckCurrency}`; } else { ratesElement.innerHTML = "获取汇率失败:" + response.error.info; } } else { ratesElement.innerHTML = "请求失败,请稍后重试"; } }; request.onerror = function() { ratesElement.innerHTML = "网络错误,无法连接到汇率服务器"; }; request.send(); }; </script>
修复说明
- 将所有逻辑移至点击事件回调内部,解决变量作用域问题
- 把DOM更新逻辑放到
request.onload回调中,确保在API响应返回后再更新内容 - 修正了捷克的国家名称拼写错误
- 添加了无效货币、API请求失败、网络错误的处理逻辑,提升用户体验
内容的提问来源于stack exchange,提问作者Gonzo
相关产品推荐
相关产品推荐

