如何使用indexOf()而不是include()返回布尔值?

问题描述 投票:0回答:1

我正在做一个计算器挑战,当我开始求解小数点部分时,它给了我意外的行为。我创建了一个称为输入数字的函数,单击小数点键时,需要在显示中已经存在的数字后附加一个小数点。在函数内部,我使用了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="*">&times;</button>
    <button type="button" class="operator" value="/">&divide;</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>
javascript indexof
1个回答
0
投票

addEventListener代码中,因为您要处理除数字以外的所有情况,所以对于所有事件侦听器,将为每种类型的按钮单击(无论是数字,十进制还是运算符)调用inputDigit(target.value)函数。因此,在加上小数点时,有两个函数分别称为inputDecimalinputDigit,这就是为什么每次单击小数点都会得到两个小数点的原因。

为避免这种情况,您只需为所有数字输入添加'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="*">&times;</button>
    <button type="button" class="operator" value="/">&divide;</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>
© www.soinside.com 2019 - 2024. All rights reserved.