代码之家  ›  专栏  ›  技术社区  ›  Enlico

onkeyup和onkeydown在交错按压和释放时发生干扰

  •  0
  • Enlico  · 技术社区  · 2 年前

    序列

    1. 持有除 转移 向下(说 Alt ),
    2. 持有 转移 向下
    3. 释放自步骤1以来保持的钥匙,
    4. 释放 转移 ,

    结果使“其他键”保持有色,就像 = 'none' 这条线并没有跑过去。

    事实上,这里的GIF显示了与上述4个动作相对应的行为:

    enter image description here

    正如你所看到的,“Alt-up”消息没有打印出来,但相信我,我正在释放 Alt 在压制之间 Shifrt 和释放 转移


    现在我正在尝试另一个系统 转移 不是唯一的,我可以用 Ctrl (另一个键例如是4个箭头中的一个)。


    为什么?这是不可避免的吗?

    window.onkeydown = listenKeyDown;
    window.onkeyup = listenKeyUp;
    
    function listenKeyDown(e) {
      console.log(e.key + " down")
      if (e.altKey) {
        document.getElementById('alt').style.background = '#00ff00';
      }
      if (e.ctrlKey) {
        document.getElementById('ctrl').style.background = '#00ff00';
      }
      if (e.shiftKey) {
        document.getElementById('shift').style.background = '#00ff00';
      }
      let elem = document.getElementById(e.key);
      if (elem && !e.altKey && !e.ctrlKey && !e.shiftKey) {
        elem.style.background = '#00ff00';
      }
    }
    
    function listenKeyUp(e) {
      console.log(e.key + " up")
      if (e.altKey) {
        document.getElementById('alt').style.background = 'none';
      }
      if (e.ctrlKey) {
        document.getElementById('ctrl').style.background = 'none';
      }
      if (e.shiftKey) {
        document.getElementById('shift').style.background = 'none';
      }
      let elem = document.getElementById(e.key);
      if (elem && !e.altKey && !e.ctrlKey && !e.shiftKey) {
        document.getElementById(e.key).style.background = 'none';
      }
    }
    <div id="alt">Alt</div>
    <div id="ctrl">Ctrl</div>
    <div id="shift">Shift</div>
    <div id="End">End</div>
    <div id="Home">Start</div>
    <div id="ArrowUp">Up</div>
    <div id="ArrowLeft">Left</div>
    <div id="ArrowDown">Down</div>
    <div id="ArrowRight">Right</div>
    <ol>
      <li>Hold down a key (listed above, but other than Shift),</li>
      <li>Hold Shift down</li>
      <li>Release the key of step 1</li>
      <li>Release Shift</li>
    </ol>
    0 回复  |  直到 2 年前
        1
  •  1
  •   Mr. Polywhirl    2 年前

    您可以使用 Set

    此外,请避免在元素上动态设置CSS。使用类进行样式设置。

    const pressedKeys = new Set();
    
    window.addEventListener('keydown', handleKeyDown);
    window.addEventListener('keyup', handleKeyUp);
    
    function handleKeyDown(e) {
      e.preventDefault();
      pressedKeys.add(e.key);
      update();
    }
    
    function handleKeyUp(e) {
      e.preventDefault();
      pressedKeys.delete(e.key);
      update();
    }
    
    function update(e) {
      for (let key of document.querySelectorAll('.key')) {
        key.classList.toggle('pressed', pressedKeys.has(key.dataset.key));
      }
    }
    .pressed {
      background: limegreen;
    }
    <div class="key" data-key="Alt">Alt</div>
    <div class="key" data-key="Control">Ctrl</div>
    <div class="key" data-key="Shift">Shift</div>
    <div class="key" data-key="End">End</div>
    <div class="key" data-key="Home">Start</div>
    <div class="key" data-key="ArrowUp">Up</div>
    <div class="key" data-key="ArrowLeft">Left</div>
    <div class="key" data-key="ArrowDown">Down</div>
    <div class="key" data-key="ArrowRight">Right</div>