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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:15:46