为什么具有更改的输入事件监听器没有获取值

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

我有这三个数字类型的输入,您只能添加一个数字,并且可以通过按 0 到 9 之间的任何其他数字来替换它。我在这些输入上有 2 个事件侦听器,第一个是能够更改通过按 0 到 9 之间的数字(使用“keyup”)进行输入。
第二个事件侦听器用于检测输入,然后计算三个输入的总和,当计算出正确的总和时,会引发警报。我注意到,如果我想要总共 27 个,例如我需要在输入中添加 9 + 9 + 9。
但是,如果我添加 9 + 8 + 9,但没有删除 8,只是按 9 替换它,我就不会收到警报。为了获得更好的总数,似乎可以在事件侦听器中使用“keyup”来完成此操作。
那么这是为什么呢?当按下9按钮时它仍然是一个输入事件?

const element1 = document.querySelector('.element1')
let total = 0
let desiredTotal = 27

    let allInputs = Array.from(element1.getElementsByTagName('input'))
    allInputs.forEach((input)=>{
        input.style.border = '2px solid blue'
        input.addEventListener('keyup', (e)=>{
            if(e.target.value.length === 1 && parseFloat(e.key) >= 0 && parseFloat(e.key) <=9){
                    e.target.value = e.key
            }
        })
    })


    allInputs.forEach((input)=>{
        let value
        input.addEventListener('input', (e)=>{
            let value = parseFloat(input.value)
            total += value
            console.log(total)
            if(total === 27) alert('you won!')
        })

    })
input{
    width: 2ch;
}

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

input[type=number] {
  appearance: textfield;
}
<body>
    <div class="element1">
        <input type="number" name="" id="input1" onKeyPress="if(this.value.length===1 || event.key == 'e') {return false}">
        <input type="number" name="" id="input2" onKeyPress="if(this.value.length===1 || event.key == 'e') {return false}">
        <input type="number" name="" id="input3"onKeyPress="if(this.value.length===1 || event.key == 'e') {return false}">
    </div>
    <p>Try to obtain a total of 27</p>
    <p>Try to place 9 9 and then 9 you get the alert</p>
    <p>Try to place 9 6 and then 9 but then change(without deleting) but pressing on the 6 containing input the number 9 you won't get the alert</p>
</body>

javascript input event-listener
1个回答
0
投票

不要混合使用 HTML 输入 onKeyPress 和 JS EventListener。
一切都用 JS 完成

document.querySelectorAll('.element1 input').forEach( (inElm,_,All) =>
  {
  inElm.addEventListener('keydown', e =>
    {
    if ( /\d/.test(e.key) ) e.target.value = e.key; // accept only digitals 
 
    if (e.key !== 'Tab')    e.preventDefault();    // do ignore input event

    let Total = 0;
    All.forEach( inN => Total += inN.valueAsNumber );

    console.clear();
    console.log( 'Total', Total );
    });
  });
input[type="number"] {
  width      : 2ch;
  border     : 2px solid blue;
  text-align : center;
  margin     : .5em;
  appearance : textfield;
  }
<div class="element1">
  <input type="number" value="0" >
  <input type="number" value="0" >
  <input type="number" value="0" >
</div>
<p>Try to obtain a total of 27</p>

© www.soinside.com 2019 - 2024. All rights reserved.