Files

123 lines
2.9 KiB
JavaScript

// ===== 计算器状态 =====
let currentInput = '0'; // 当前显示的数字
let firstOperand = null; // 第一个操作数
let operator = null; // 当前运算符
let waitingForSecond = false; // 是否等待输入第二个操作数
// 获取显示屏元素
const display = document.getElementById('display');
/**
* 更新显示屏内容
*/
function updateDisplay() {
display.value = currentInput;
}
/**
* 输入数字
* @param {string} num - 输入的数字字符
*/
function inputNumber(num) {
if (waitingForSecond) {
// 如果正在等待第二个操作数,则替换显示
currentInput = num;
waitingForSecond = false;
} else {
// 如果当前显示为 '0',直接替换;否则追加
currentInput = currentInput === '0' ? num : currentInput + num;
}
updateDisplay();
}
/**
* 处理运算符
* @param {string} op - 运算符类型: add, subtract, multiply, divide
*/
function handleOperator(op) {
const inputValue = parseFloat(currentInput);
// 如果已有运算符且不在等待第二个操作数,先计算之前的结果
if (operator !== null && !waitingForSecond) {
const result = calculate(firstOperand, inputValue, operator);
currentInput = String(result);
firstOperand = result;
updateDisplay();
} else {
firstOperand = inputValue;
}
waitingForSecond = true;
operator = op;
}
/**
* 执行计算
* @param {number} a - 第一个操作数
* @param {number} b - 第二个操作数
* @param {string} op - 运算符
* @returns {number} 计算结果
*/
function calculate(a, b, op) {
switch (op) {
case 'add': return a + b;
case 'subtract': return a - b;
case 'multiply': return a * b;
case 'divide': return b === 0 ? '错误' : a / b;
default: return b;
}
}
/**
* 处理等号
*/
function handleEquals() {
if (operator === null || waitingForSecond) return;
const inputValue = parseFloat(currentInput);
const result = calculate(firstOperand, inputValue, operator);
currentInput = String(result);
firstOperand = null;
operator = null;
waitingForSecond = false;
updateDisplay();
}
/**
* 清除所有状态
*/
function clearAll() {
currentInput = '0';
firstOperand = null;
operator = null;
waitingForSecond = false;
updateDisplay();
}
// ===== 事件绑定 =====
document.querySelector('.keys').addEventListener('click', (e) => {
const target = e.target;
if (!target.classList.contains('key')) return;
// 数字键
if (target.dataset.number !== undefined) {
inputNumber(target.dataset.number);
return;
}
// 功能键
const action = target.dataset.action;
switch (action) {
case 'clear': clearAll(); break;
case 'add':
case 'subtract':
case 'multiply':
case 'divide': handleOperator(action); break;
case 'equals': handleEquals(); break;
}
});
// 初始化显示
updateDisplay();