我正在做一个计算器挑战,当我开始求解小数点部分时,它给了我意外的行为。我创建了一个称为输入数字的函数,单击小数点键时,需要在显示中已经存在的数字后附加一个小数点。在函数内部,我使用了if语句通过使用(...)indexOf(dot) === -1
或!(...).includes(dot)
检查对象的属性是否不包含点,否则,我将在该属性对象上添加点。但是在浏览器中的结果是,当我单击该点时,它显示的是两个点而不是一个点,我不知道自己在做什么错。
到目前为止,这是我的代码:
const calculator = {
displayValue: '0',
firstOperand: null,
waitingForSecondOperand: false,
operator: null
};
function inputDigit(digit) {
const {
displayValue
} = calculator;
calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
//*here is the function that adds a dot*
function inputDecimal(dot) {
if (!calculator.displayValue.includes(dot)) {
calculator.displayValue += dot;
}
}
function updateDisplay() {
const display = document.querySelector('#screen');
display.value = calculator.displayValue;
}
updateDisplay();
const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (e) => {
const {
target
} = e; // is equivalent to const target = event.target;
if (!target.matches('button')) {
return;
}
if (target.classList.contains('operator')) {
console.log('operator', target.value);
return;
}
if (target.classList.contains('decimal')) {
inputDecimal(target.value);
updateDisplay();
}
if (target.classList.contains('all-clear')) {
console.log('clear', target.value);
return;
}
inputDigit(target.value);
// /
updateDisplay();
});
html {
font-size: 62.5%;
box-sizing: border-box;
}
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: inherit;
}
.calculator {
border: 1px solid #ccc;
border-radius: 5px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 400px;
}
.calculator-screen {
width: 100%;
font-size: 5rem;
height: 80px;
border: none;
background-color: #252525;
color: #fff;
text-align: right;
padding-right: 20px;
padding-left: 10px;
}
button {
height: 60px;
background-color: #fff;
border-radius: 3px;
border: 1px solid #c4c4c4;
background-color: transparent;
font-size: 2rem;
color: #333;
background-image: linear-gradient(to bottom, transparent, transparent 50%, rgba(0, 0, 0, .04));
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .05), inset 0 1px 0 0 rgba(255, 255, 255, .45), inset 0 -1px 0 0 rgba(255, 255, 255, .15), 0 1px 0 0 rgba(255, 255, 255, .15);
text-shadow: 0 1px rgba(255, 255, 255, .4);
}
button:hover {
background-color: #eaeaea;
}
.operator {
color: #337cac;
}
.all-clear {
background-color: #f0595f;
border-color: #b0353a;
color: #fff;
}
.all-clear:hover {
background-color: #f17377;
}
.equal-sign {
background-color: #2e86c0;
border-color: #337cac;
color: #fff;
height: 100%;
grid-area: 2 / 4 / 6 / 5;
}
.equal-sign:hover {
background-color: #4e9ed4;
}
.calculator-keys {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 20px;
padding: 20px;
}
<div class="calculator">
<input type="text" id="screen" class="calculator-screen" value="" disabled />
<div class="calculator-keys">
<button type="button" class="operator" value="+">+</button>
<button type="button" class="operator" value="-">-</button>
<button type="button" class="operator" value="*">×</button>
<button type="button" class="operator" value="/">÷</button>
<button type="button" value="7">7</button>
<button type="button" value="8">8</button>
<button type="button" value="9">9</button>
<button type="button" value="4">4</button>
<button type="button" value="5">5</button>
<button type="button" value="6">6</button>
<button type="button" value="1">1</button>
<button type="button" value="2">2</button>
<button type="button" value="3">3</button>
<button type="button" value="0">0</button>
<button type="button" class="decimal function" value=".">.</button>
<button type="button" class="all-clear function" value="all-clear">AC</button>
<button type="button" class="equal-sign operator" value="=">=</button>
</div>
</div>
在addEventListener
代码中,因为您要处理除数字以外的所有情况,所以对于所有事件侦听器,将为每种类型的按钮单击(无论是数字,十进制还是运算符)调用inputDigit(target.value)
函数。因此,在加上小数点时,有两个函数分别称为inputDecimal
和inputDigit
,这就是为什么每次单击小数点都会得到两个小数点的原因。
为避免这种情况,您只需为所有数字输入添加'digit'类,如下所示>>
<button type="button" value="1" class="digit">1</button> <button type="button" value="2" class="digit">2</button> <button type="button" value="3" class="digit">3</button>
并且在事件监听器中,您可以添加以下代码
if (target.classList.contains('digit')) { inputDigit(target.value); updateDisplay(); }
HTML的完整代码是
<div class="calculator"> <input type="text" id="screen" class="calculator-screen" value="" disabled /> <div class="calculator-keys"> <button type="button" class="operator" value="+">+</button> <button type="button" class="operator" value="-">-</button> <button type="button" class="operator" value="*">×</button> <button type="button" class="operator" value="/">÷</button> <button type="button" value="7" class="digit">7</button> <button type="button" value="8" class="digit">8</button> <button type="button" value="9" class="digit">9</button> <button type="button" value="4" class="digit">4</button> <button type="button" value="5" class="digit">5</button> <button type="button" value="6" class="digit">6</button> <button type="button" value="1" class="digit">1</button> <button type="button" value="2" class="digit">2</button> <button type="button" value="3" class="digit">3</button> <button type="button" value="0" class="digit">0</button> <button type="button" class="decimal function" value=".">.</button> <button type="button" class="all-clear function" value="all-clear">AC</button> <button type="button" class="equal-sign operator" value="=">=</button> </div> </div>
JavaScript代码为
<script>
const calculator = {
displayValue: '0',
firstOperand: null,
waitingForSecondOperand: false,
operator: null
};
function inputDigit(digit) {
const { displayValue } = calculator;
calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
function inputDecimal(dot) {
if (!calculator.displayValue.includes(dot)) {
calculator.displayValue += dot;
}
}
function updateDisplay() {
const display = document.querySelector('#screen');
display.value = calculator.displayValue;
}
updateDisplay();
const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (e) => {
const { target } = e; // is equivalent to const target = event.target;
if (!target.matches('button')) {
return;
}
if (target.classList.contains('operator')) {
return;
}
if (target.classList.contains('decimal')) {
inputDecimal(target.value);
updateDisplay();
}
if (target.classList.contains('all-clear')) {
console.log('clear', target.value);
return;
}
if (target.classList.contains('digit')) {
inputDigit(target.value);
updateDisplay();
}
});
</script>