Во втором кодовом блоке вам необходимо знать, что было предыдущим оператором (появляется в элементе displayPrevious
), и использовать его для вызова operate()
. Оператор, который соответствует нажатой кнопке, еще не может использоваться для вычисления, поскольку у вас еще нет второго операнда для него. Таким образом, этот оператор должен быть сохранен в переменной для последующего использования.
operatorButtons.forEach(function (operatorButton) {
operatorButton.addEventListener("click", function () {
if (operator) { // Is there already a pending operator?
finalSum = operate(operator, finalSum, currentValue);
} else { // first time
finalSum = currentValue;
}
displayCurrent.textContent = "";
operator = this.value; // remember the new operator
if (operator === "=") operator = ""; // this is not really an operator
displayPrevious.textContent = finalSum + operator;
});
});
В приведенном ниже фрагменте кода используется приведенный выше код с калькулятором minimalisti c. Это касается только вашего вопроса, но не касается деления, десятичных дробей, приоритета оператора, очистки ввода, ...
let buttons = [...document.querySelectorAll("#divButtons input[type=button]")];
let numberButtons = buttons.filter(button => !isNaN("0"+button.value));
let operatorButtons = buttons.filter(button => isNaN("0"+button.value));
let displayCurrent = document.querySelector("#current");
let displayPrevious = document.querySelector("#previous");
let currentValue = 0;
let finalSum = 0;
let operator = "";
function operate(operator, a, b) {
switch (operator) {
case "+": return a+b;
case "−": return a-b;
case "×": return a*b;
}
}
numberButtons.forEach(function (numberButton){
numberButton.addEventListener("click", function () {
displayCurrent.textContent += this.value;
currentValue = +displayCurrent.textContent;
});
})
operatorButtons.forEach(function (operatorButton) {
operatorButton.addEventListener("click", function () {
if (operator) { // Is there already a pending operator?
finalSum = operate(operator, finalSum, currentValue);
} else { // first time
finalSum = currentValue;
}
displayCurrent.textContent = "";
operator = this.value; // remember the new operator
if (operator === "=") operator = ""; // this is not really an operator
displayPrevious.textContent = finalSum + operator;
});
});
input[type=button] { width: 100%; }
td[colspan="4"] {
border: 1px solid;
text-align: right;
}
td[colspan="4"]:after {
content: '.';
visibility: hidden;
}
<table id="divButtons">
<tr><td colspan="4" id="previous"></td></tr>
<tr><td colspan="4" id="current"></td></tr>
<tr><td><input type="button" value="7"></td><td><input type="button" value="8"></td><td><input type="button" value="9"></td><td><input type="button" value="+"></td></tr>
<tr><td><input type="button" value="4"></td><td><input type="button" value="5"></td><td><input type="button" value="6"></td><td><input type="button" value="−"></td></tr>
<tr><td><input type="button" value="1"></td><td><input type="button" value="2"></td><td><input type="button" value="3"></td><td><input type="button" value="×"></td></tr>
<tr><td colspan="3"><input type="button" value="0"></td><td><input type="button" value="="></td></tr>
</table>