简体   繁体   English

按清除按钮后计算器键盘输入显示混乱

[英]Calculator keyboard input display messes up after pressing clear button

Hello I'm just getting started with javascript and I've created a calculator which is running excellent except I have run into a bug that has had me stuck for days.您好,我刚刚开始使用 javascript,我创建了一个运行良好的计算器,但我遇到了一个让我卡住了好几天的错误。 I have an issue with the keyboard input.我有键盘输入问题。

When first opening the calculator, the keyboard input works as it should and pressing enter returns the proper answer.首次打开计算器时,键盘输入正常工作,按回车键返回正确答案。 But after the AC button is clicked, when you press the enter key, the display always shows 0, even though the displayNumber variable shows the proper number when I console log it.但是在单击 AC 按钮后,当您按下 Enter 键时,显示始终显示 0,即使我在控制台记录时 displayNumber 变量显示正确的数字。

Clicking the enter button instead of pressing the key always returns the proper answer, and after that the enter key works as it should until the AC button is clicked again.单击回车按钮而不是按下该键总是会返回正确的答案,然后回车键会正常工作,直到再次单击 AC 按钮。 When only clicking the buttons, everything works as it should.仅单击按钮时,一切正常。

Here's my code, I believe the problem is in the event listener or one of these functions:这是我的代码,我相信问题出在事件侦听器或以下功能之一中:

https://jsfiddle.net/novakoda9/q7pcynok/4/ https://jsfiddle.net/novakoda9/q7pcynok/4/

function equalize() {
  num1 = Number(previousNumber.slice(0,-2));
  num2 = Number(displayNumber);
  displayNumber = operate(num1, operator, num2).toString();
  previousNumber = '0';
  updateDisplay(displayNumber, '');
  answered = true;
};

function clear() {
  displayNumber = '0';
  previousNumber = '0';
  operator = '';
  answered = false;
  updateDisplay(displayNumber, '');
};

function updateDisplay(current, history) {
  currentDisplay.innerHTML = current;
  if (history !== undefined) {
    historyDisplay.innerHTML = history;
  }
};

function keyPressed(key) {
  if (!isNaN(key) | key === '.') {
    numberClicked(key);
  } else if (key === '+' | key === '-' | key === '*' | key === '/') {
    storeNumber(displayNumber, key);
  } else if (key === 'Enter') {
    equalize();
  } else if (key === 'Backspace') {
    displayNumber = '0';
    updateDisplay(displayNumber);
  };
};

window.addEventListener('keydown', (k) => {
  let keyInput = k.key;
  let validInput = /^\d|\.|\+|\-|\*|\/|Backspace|Enter/;

  if (validInput.test(keyInput)) {
    keyPressed(keyInput);
  }
});

I'm really not sure if its a function causing the issue or the event listener.我真的不确定它是导致问题的函数还是事件侦听器。 Any help would be greatly appreciated!任何帮助将不胜感激!

I think your problem here might be that when manually clicking the number buttons, after a click, the given button remains selected or "in-focus" therefore hijacking the Enter key.我认为您的问题可能是当手动单击数字按钮时,单击后,给定的按钮保持选中状态或“聚焦”,因此劫持了 Enter 键。

Add remove focus to all the buttons that you intend the user to click manually and you'll be dandy!将移除焦点添加到您希望用户手动单击的所有按钮上,您会很漂亮!

AS said by the @tractatusviii because of the focus is remains on the button therefor when you press enter key it run function related with enter key and function related with focused key.when you click on AC key focus is remains on it and when you press enter it set the final answer in display and because of focus on AC key and you press enter it also call clear() function.and out put is reset by clear function.正如@tractatusviii所说,因为当你按下回车键时,焦点仍然在按钮上,它运行与回车键相关的功能和与聚焦键相关的功能。当你点击AC键时,焦点仍然在它上面,当你按下时输入它在显示中设置最终答案,因为焦点在 AC 键上,你按下输入它也会调用 clear() 函数。输出被清除函数重置。 you can use blur();你可以使用模糊(); method to remove focus from clicked button.从单击的按钮上移除焦点的方法。

 function add(num1, num2) { return num1 + num2; }; function subtract(num1, num2) { return num1 - num2; }; function multiply(num1, num2) { return num1 * num2; }; function divide(num1, num2) { return num1 / num2; }; function operate(num1, op, num2) { let answer = 0; switch (op) { case '+': answer = add(num1, num2); break; case '-': answer = subtract(num1, num2); break; case '×': answer = multiply(num1, num2); break; case '*': answer = multiply(num1, num2); break; case '/': answer = divide(num1, num2); break; }; return answer; }; function numberClicked(number) { if (displayNumber === '0' || answered === true) { displayNumber = number.toString(); updateDisplay(displayNumber); if (answered === true) {answered = false;}; } else { displayNumber = displayNumber.toString() + number.toString(); updateDisplay(displayNumber); }; }; function storeNumber(number, op) { operator = op.toString(); previousNumber = displayNumber.toString() + ' ' + operator; displayNumber = '0'; updateDisplay(displayNumber, previousNumber); }; function equalize() { num1 = Number(previousNumber.slice(0,-2)); num2 = Number(displayNumber); displayNumber = operate(num1, operator, num2).toString(); previousNumber = '0'; updateDisplay(displayNumber, ''); answered = true; }; function clear() { displayNumber = '0'; previousNumber = '0'; operator = ''; answered = false; updateDisplay(displayNumber, ''); }; function updateDisplay(current, history) { currentDisplay.innerHTML = current; if (history !== undefined) { historyDisplay.innerHTML = history; } }; function keyPressed(key) { if (!isNaN(key) | key === '.') { numberClicked(key); } else if (key === '+' | key === '-' | key === '*' | key === '/') { storeNumber(displayNumber, key); } else if (key === 'Enter') { equalize(); } else { displayNumber = '0'; updateDisplay(displayNumber); }; }; let displayNumber = '0'; let previousNumber = '0'; let operator = ''; let answered = false; const numberButtons = document.querySelectorAll('.numberButton'); const operatorButtons = document.querySelectorAll('.operatorButton'); const equalButton = document.querySelector('.equal'); const backButton = document.querySelector('.back'); const clearButton = document.querySelector('.clear'); const currentDisplay = document.getElementById('result'); const historyDisplay = document.getElementById('history'); numberButtons.forEach(button => { button.addEventListener('click', () => { numberClicked(button.innerHTML); }); }); operatorButtons.forEach(button => { button.addEventListener('click', () => { storeNumber(displayNumber, button.innerHTML); }); }); equalButton.addEventListener('click', () => { equalize(); }); clearButton.addEventListener('click', () => { clear(); /*move focus*/ clearButton.blur(); }); backButton.addEventListener('click', () => { displayNumber = '0'; updateDisplay(displayNumber); }); window.addEventListener('keydown', (k) => { let keyInput = k.key; let validInput = /^\\d|\\.|\\+|\\-|\\*|\\/|Backspace|Enter/; if (validInput.test(keyInput)) { keyPressed(keyInput); } });
 body { align-items: center; text-align: center; background-color: #900; } #calculator { margin: 3em auto; display: grid; grid-auto-rows: minmax(100px, auto); background: #ddd; box-shadow: 3px 9px 12px 5px #111; width: 400px; height: 600px; } .display { margin: 10px; border: solid 1px black; background: white; display: inline; font-weight: bold; position: relative; } #history { font-size: 20px; color: #888; position: absolute; top: 10px; right: 10px; text-align: right; } #result { font-size: 30px; text-align: right; position: absolute; bottom: 10px; right: 10px; } #buttons { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: minmax(100px, auto); } button { min-height: 5vw; min-width: 5vw; padding: 10px; margin: 10px; border: 1px solid white; border-radius: 55px; font-size: 20px; font-weight: bolder; } .operatorButton { background: #9F9; } .zero { grid-column: 1/3; } .one { grid-column: 1; grid-row: 4; } .two { grid-column: 2; grid-row: 4; } .three { grid-column: 3; grid-row: 4; } .four { grid-column: 1; grid-row: 3; } .five { grid-column: 2; grid-row: 3; } .six { grid-column: 3; grid-row: 3; } .seven { grid-column: 1; grid-row: 2; } .eight { grid-column: 2; grid-row: 2; } .nine { grid-column: 3; grid-row: 2; } .divide { grid-column: 4; grid-row: 2; } .times { grid-column: 4; grid-row: 3; } .minus { grid-column: 4; grid-row: 5; } .add { grid-column: 4; grid-row: 4; } .equal { grid-column: 3/5; grid-row: 1; background: green; } .back { grid-column: 2; grid-row: 1; background: #F99; } .clear { grid-column: 1; grid-row: 1; background: red; }
 <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <link rel="stylesheet" href="styles.css"> <title></title> </head> <body> <div id="calculator"> <div class="display"> <div id="history"></div> <div id="result">0</div> </div> <div id="buttons"> <button type="button" class="button clear">AC</button> <button type="button" class="button back">⌫</button> <button type="button" class="button equal">=</button> <button type="button" class="button operatorButton divide">/</button> <button type="button" class="button operatorButton times">×</button> <button type="button" class="button operatorButton minus">-</button> <button type="button" class="button operatorButton add">+</button> <button type="button" class="button numberButton nine">9</button> <button type="button" class="button numberButton eight">8</button> <button type="button" class="button numberButton seven">7</button> <button type="button" class="button numberButton six">6</button> <button type="button" class="button numberButton five">5</button> <button type="button" class="button numberButton four">4</button> <button type="button" class="button numberButton three">3</button> <button type="button" class="button numberButton two">2</button> <button type="button" class="button numberButton one">1</button> <button type="button" class="button numberButton zero">0</button> <button type="button" class="button numberButton point">.</button> </div> </div> <script src="script.js"></script> </body> </html>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM