JavaScript中input预设value时keyup事件不触发货币转换如何解决
问题根因
现有转换逻辑仅绑定了输入框的keyup事件,该事件只会在用户手动敲击键盘抬起时触发,页面初始加载时写入的静态预设值value="444"不会触发键盘事件,自然不会执行转换计算。另外原代码存在两处额外bug:
- USD输入框重复写了两个
value属性,后写的空值会覆盖前面的444预设值 - 存在多余的
</div>闭合标签、style属性多余分号等HTML语法问题 - 汇率取值用
parseInt强制取整,会导致大额计算出现明显误差
修改方案
- 修复HTML语法问题:删除USD输入框上多余的
value=""属性,修正错误的标签结构 - 将耦合在事件回调里的转换逻辑抽为独立公共函数,方便多处调用
- 页面DOM加载完成后,主动调用转换函数,传入带预设值的USD输入框作为触发源,完成初始值的自动转换
- 将
keyup事件替换为input事件,兼容粘贴、鼠标调整数值、脚本赋值等更多输入场景,补全空值判断避免出现NaN异常
修改后可直接运行的完整代码
<!DOCTYPE html> <html> <head> <style> </style> </head> <body> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <input type="number" name="eth" class="currencyField" placeholder="ETH"> <div class="arrow" style="margin: 0 10px;">=</div> <input type="number" name="usd" value="444" class="currencyField" placeholder="USD"> <span id="price"></span> <script type="text/javascript"> // 抽离独立转换函数 function convertCurrency(triggerEl) { let convFrom, convTo; if($(triggerEl).prop("name") == "eth") { convFrom = "eth"; convTo = "usd"; } else { convFrom = "usd"; convTo = "eth"; } $.getJSON("https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=ethereum", function(data) { const origAmount = parseFloat($("input[name='" + convFrom + "']").val()); const exchangeRate = parseFloat(data[0].current_price); // 空值/非法值直接清空 if(isNaN(origAmount) || origAmount <= 0) { $("input[name='" + convTo + "']").val(''); $("#price").text(''); return; } const amount = convFrom == "eth" ? origAmount * exchangeRate : origAmount / exchangeRate; $("input[name='" + convTo + "']").val(amount.toFixed(2)); $("#price").text(amount.toFixed(2)); } ); } // 绑定全场景输入事件 $(".currencyField").on('input', function(){ convertCurrency(this); }); // 页面加载完成后自动触发预设值转换 $(function() { const $usdInput = $("input[name='usd']"); if($usdInput.val()) convertCurrency($usdInput); }) </script> </body> </html>
内容的提问来源于stack exchange,提问作者0xWenMoon
相关产品推荐
相关产品推荐

