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

JavaScript计算器按Enter键触发click事件问题求助

JavaScript计算器Enter键触发意外点击事件的问题

我正在开发一款JavaScript计算器,遇到一个问题:按下Enter键时,会触发最后一个绑定了addEventListener('click')的按钮事件,但我并没有为Enter键设置任何相关逻辑。我尝试过为Enter键单独编写处理函数,甚至把涉及Enter键的加法相关代码注释掉了,问题依然存在。


HTML代码

<!DOCTYPE html>
<html lang="pt-br">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="../css/calculator.css" />
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link
      href="https://fonts.googleapis.com/css2?family=Reddit+Mono:wght@200..900&display=swap"
      rel="stylesheet"
    />
    <title>Calculadora em JS</title>
  </head>
  <body>
    <section class="container">
        <div class="resultado">
            <p class="resultado_anterior"></p>
            <p class="resultado_calc"></p>
        </div>
        <a href="" class="porcentagem input_logico">%</a>
        <a href="" class="reset_teclado">CE</a>
        <a href="" class="reset_calc">C</a>
        <a href="" class="backspace">&#9003;</a>
        <a href="" class="um_dividido">1/x</a>
        <a href="" class="quadrado">Potência (2)</a>
        <a href="" class="raiz">Raiz (2)</a>
        <a href="" class="divisao input_logico">÷</a>
        <a href="" class="sete input">7</a>
        <a href="" class="oito input">8</a>
        <a href="" class="nove input">9</a>
        <a href="" class="multiplicacao input_logico">×</a>
        <a href="" class="quatro input">4</a>
        <a href="" class="cinco input">5</a>
        <a href="" class="seis input">6</a>
        <a href="" class="menos input_logico">-</a>
        <a href="" class="um input">1</a>
        <a href="" class="dois input">2</a>
        <a href="" class="tres input">3</a>
        <a href="" class="mais input_logico">+</a>
        <a href="" class="negativo_positivo">+/-</a>
        <a href="" class="zero input">0</a>
        <a href="" class="virgula input">,</a>
        <a href="" class="igual">=</a>
    </section>
    <script src="../js/calculator.js"></script>
  </body>
</html>

JavaScript代码

document.addEventListener("DOMContentLoaded", (event) => {
    inputs();
    reset()
    backspace()
    negativo_positivo()
})

const RESULTADO = document.querySelector(".resultado_calc")
const RESULTADO_ANTERIOR = document.querySelector(".resultado_anterior")
let aux = ""
let currentInput = ""
let prevInput = ""

// 数字键功能
function inputs() {
    document.querySelectorAll(".input").forEach(input => {
        window.addEventListener("keypress", tecla => {
            if (tecla.key === input.innerHTML) {
                currentInput = RESULTADO.textContent += `${tecla.key}`
                RESULTADO.textContent = currentInput
            }
        })
    })
    document.querySelectorAll(".input").forEach(input => {
        input.addEventListener("click", event => {
            event.preventDefault()
            currentInput += `${input.textContent}`
            RESULTADO.textContent = currentInput
            
        })
    })
}

// 删除键功能
function backspace() {
    document.querySelector(".backspace").addEventListener("click", event => {
        event.preventDefault()
        currentInput = RESULTADO.textContent.slice(0, -1)
        RESULTADO.textContent = currentInput
    })

    window.addEventListener("keydown", event => {
        if (event.key === "Backspace") {
            currentInput = RESULTADO.textContent.slice(0, -1)
            RESULTADO.textContent = currentInput
        }
    });
}

// 正负切换功能
function negativo_positivo() {
    document.querySelector(".negativo_positivo").addEventListener("click", event => {
        event.preventDefault()
        if (RESULTADO.textContent >= 0) {
            currentInput = -(currentInput)
            return (RESULTADO.textContent = currentInput)
        } else {
            currentInput = -(currentInput)
            return (RESULTADO.textContent = currentInput)
        }
    })
}

// // 加法功能(已注释)
// window.addEventListener("keydown", event => {
//     document.querySelectorAll(".input_logico").forEach(input_logico => {
//         if (input_logico.innerHTML === event.key) {
//             event.preventDefault()
//             aux = currentInput
//             prevInput = RESULTADO_ANTERIOR.textContent = aux + input_logico.innerHTML
//             RESULTADO_ANTERIOR.textContent = prevInput
//             currentInput = ""
//             RESULTADO.textContent = currentInput
//             console.log("currentInput Soma = " + currentInput)
//             console.log("prevInput Soma = " + prevInput)

//             window.addEventListener("keypress", event => {
//                 if (RESULTADO.textContent === "") {
//                     event.preventDefault()
//                     // RESULTADO.textContent = currentInput
//                 } else {
//                     if (event.key === "Enter") {
//                         event.preventDefault()

//                         prevInput = RESULTADO_ANTERIOR.textContent = aux + input_logico.innerHTML + currentInput
//                         console.log(prevInput)
//                         RESULTADO_ANTERIOR.textContent = prevInput
//                         currentInput = RESULTADO.textContent = parseFloat(aux) + parseFloat(currentInput)
//                         RESULTADO.textContent = currentInput
//                         console.log("currentInput Soma2 = " + currentInput)
//                         console.log("prevInput Soma2 = " + prevInput)
//                     }
//                 }
//             })
//         }
//     })
// })

// 重置功能
function reset() {
    document.querySelector(".reset_calc").addEventListener("click", event => {
        event.preventDefault()
        RESULTADO.textContent = ""
        RESULTADO_ANTERIOR.textContent = ""
        aux = ""
        currentInput = ""
        prevInput = ""
        console.log("reset")
    })
}

问题原因与解决方法

原因

浏览器默认会将Enter键触发的交互行为映射到页面最后一个可聚焦的交互式元素上,你的计算器里最后一个绑定click事件的是=按钮(.igual),因此按下Enter时会自动触发它的点击逻辑。另外,你使用<a>标签作为按钮,即使加了preventDefault()阻止跳转,依然无法完全规避浏览器的默认交互映射。

解决方法

  1. 全局拦截Enter键默认行为
    在DOMContentLoaded回调中添加全局Enter键监听,直接阻止它的默认行为,避免触发意外点击:
document.addEventListener("DOMContentLoaded", (event) => {
    inputs();
    reset()
    backspace()
    negativo_positivo()
    
    // 新增:拦截Enter键默认行为
    window.addEventListener("keydown", (e) => {
        if (e.key === "Enter") {
            e.preventDefault();
            // 可选:如果需要Enter键等同于点击=按钮,解开下面的注释
            // document.querySelector(".igual").click();
        }
    });
})
  1. 替换语义化标签(可选)
    将所有<a>标签替换为<button>标签,这更符合按钮的语义,也能减少浏览器默认行为带来的问题:
<button class="porcentagem input_logico">%</button>
<button class="reset_teclado">CE</button>
<button class="reset_calc">C</button>
<!-- 其他按钮同理替换 -->

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:32:33