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

Keypress/keyup函数未输出目标console.log且非法字符过滤失效问题

解决你的计算器键盘输入问题

看起来你的代码遇到了几个典型的前端事件绑定和资源冲突问题,我帮你梳理一下原因和修复方案:

问题根源分析

  • 重复引入jQuery:页面里加载了两个不同版本的jQuery(2.1.1和3.2.1),这会导致jQuery核心对象被覆盖,事件绑定、DOM操作都会出现不可预期的问题,这是行为不稳定的主要原因之一。
  • 重复的事件监听代码:你写了两段几乎完全一样的键盘事件监听逻辑(一段用keypress,一段用keyup),这会让同一个按键触发两次处理逻辑,而且两个逻辑里的infix变量是各自独立的,导致你看到的控制台输出混乱。
  • keypress事件的兼容性问题:keypress事件已经被标记为废弃,而且它对某些按键的e.key返回值可能不符合预期,比如数字键在某些输入法状态下的表现。

修复后的完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Calculator</title>
    <!-- 只保留一个jQuery版本 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <style>
        body { background-color: #000000; }
        .container { width: 420px; height: 500px; background-color: #c8c8c8; }
        .btn-group { margin: 5px; }
        .btn.btn-primary { width: 59px; height: 34px; }
        #title { background-color: #c8c8c8; }
        #screen { 
            width: 300px; 
            height: 35px; 
            border-radius: 15px; 
            margin: 5px 0px 10px 0px; 
            color:black; 
            font-size: 15px; 
            text-align:right; 
            padding-bottom:0; 
            font-family: helvetica; 
        }
    </style>
    <script>
        $(document).ready(function () { 
            // 声明全局的输入字符串
            let infix = ""; 

            // 键盘输入处理逻辑
            $(window).on("keyup", function(e) { 
                // 只允许0-9的数字按键
                const validKeys = "0123456789";
                if(validKeys.includes(e.key)) { 
                    infix += e.key; 
                    console.log("当前infix内容:", infix);
                    // 同步更新输入框显示
                    $("#screen").val(infix);
                } else {
                    console.log("非法按键,已忽略:", e.key);
                }
            }); 

            // 清除按钮逻辑
            $("#clear").on("click", function() {
                infix = "";
                $("#screen").val("");
                console.log("已清除输入");
            });
        }); 
    </script>
</head>
<body>
    <div class="container">
        <div class="row text-center">
            <div id="title" class="col-md-12 text-center">
                <h4>Business Analyst</h4>
            </div>
            <div class="col-md-12 body text-center">
                <input id="screen" type=text>
            </div>
            <div class="col-md-12 body text-center">
                <div class="btn-group">
                    <button id="enter" class="btn btn-primary">Enter</button>
                </div>
                <div class="btn-group">
                    <button id="compute" class="btn btn-primary">CPT</button>
                </div>
                <div class="btn-group">
                    <button id="clear-cash-flow" class="btn btn-primary">CCF</button>
                </div>
                <div class="btn-group">
                    <button id="analyst-mode" class="btn btn-primary">AM</button>
                </div>
            </div>
            <div class="col-md-12 body text-center">
                <div class="btn-group">
                    <button id="fut-val" class="btn btn-primary">FV</button>
                </div>
                <div class="btn-group">
                    <button id="cash-flow" class="btn btn-primary">CF</button>
                </div>
                <div class="btn-group">
                    <button id="net-pv" class="btn btn-primary">NPV</button>
                </div>
                <div class="btn-group">
                    <button id="irr" class="btn btn-primary">IRR</button>
                </div>
            </div>
            <div class="col-md-12 body text-center">
                <div class="btn-group">
                    <button id="period" class="btn btn-primary">N</button>
                </div>
                <div class="btn-group">
                    <button id="int-rate" class="btn btn-primary">I|Y</button>
                </div>
                <div class="btn-group">
                    <button id="pres-val" class="btn btn-primary">PV</button>
                </div>
                <div class="btn-group">
                    <button id="payment" class="btn btn-primary">PMT</button>
                </div>
            </div>
            <div class="col-md-12 body text-center">
                <div class="btn-group">
                    <button id="clear" class="btn btn-primary">C</button>
                </div>
                <div class="btn-group">
                    <button id="percent" class="btn btn-primary">%</button>
                </div>
                <div class="btn-group">
                    <button id="lftparen" class="btn btn-primary">(</button>
                </div>
                <div class="btn-group">
                    <button id="rtparen" class="btn btn-primary">)</button>
                </div>
            </div>
            <div class="col-md-12 body text-center">
                <div class="btn-group">
                    <button id="seven" class="btn btn-primary">7</button>
                </div>
                <div class="btn-group">
                    <button id="eight" class="btn btn-primary">8</button>
                </div>
                <div class="btn-group">
                    <button id="nine" class="btn btn-primary">9</button>
                </div>
                <div class="btn-group">
                    <button id="division" class="btn btn-primary"><span>&#247;</span></button>
                </div>
            </div>
            <div class="col-md-12 body text-center">
                <div class="btn-group">
                    <button id="four" class="btn btn-primary">4</button>
                </div>
                <div class="btn-group">
                    <button id="five" class="btn btn-primary">5</button>
                </div>
                <div class="btn-group">
                    <button id="six" class="btn btn-primary">6</button>
                </div>
                <div class="btn-group">
                    <button id="multiplication" class="btn btn-primary">X</button> <!-- 修复重复的id -->
                </div>
            </div>
            <div class="col-md-12 body text-center">
                <div class="btn-group">
                    <button id="one" class="btn btn-primary">1</button>
                </div>
                <div class="btn-group">
                    <button id="two" class="btn btn-primary">2</button>
                </div>
                <div class="btn-group">
                    <button id="three" class="btn btn-primary">3</button>
                </div>
                <div class="btn-group">
                    <button id="subtraction" class="btn btn-primary">-</button>
                </div>
            </div>
            <div class="col-md-12 body text-center">
                <div class="btn-group">
                    <button id="zero" class="btn btn-primary">0</button>
                </div>
                <div class="btn-group">
                    <button id="decimal" class="btn btn-primary">.</button>
                </div>
                <div class="btn-group">
                    <button id="equal" class="btn btn-primary">=</button>
                </div>
                <div class="btn-group">
                    <button id="addition" class="btn btn-primary">+</button>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

关键修改点说明

  1. 移除重复的jQuery引入:只保留了3.2.1版本,避免版本冲突导致的异常。
  2. 删除冗余的事件代码:只保留了一段keyup事件监听,确保逻辑唯一,不会出现重复触发的情况。
  3. 优化按键判断:明确validKeys变量,让判断逻辑更清晰,同时严格只允许0-9的数字按键被记录。
  4. 同步输入框显示:每次输入数字后,把infix的内容同步到#screen输入框,让用户能直观看到输入内容。
  5. 修复重复ID问题:原来的乘法按钮和除法按钮都用了id="division",这是无效的HTML,改成了id="multiplication"。
  6. 添加清除按钮逻辑:补充了清除按钮的点击事件,方便测试和使用。
  7. 优化控制台输出:把模糊的console.log("infix" + e.key)改成了更清晰的console.log("当前infix内容:", infix),同时增加了非法按键的提示,方便调试。

现在你可以测试这个修复后的代码,应该能正常捕获数字按键,控制台会输出正确的infix内容,非法按键也会被正确忽略,不会被记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:30:18