123 lines
2.9 KiB
JavaScript
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();
|