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

人们在我的标签上按下shift,但在另一个标签上释放它。如何防止Ctrl+Shift+Tab破坏我的“Shift_pressed”变量?

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

    我正在开发一个待办事项列表浏览器应用程序(用JavaScript、HTML和CSS编写,没有jQuery),我想为 选项卡 shift+tab ,因为这些应该是缩进而不是导航。由于没有办法直接捕获键组合,我创建了 shift_pressed 检测何时 转移 按下:

    document.addEventListener('keyup', function (event) {
        if (event.key === 'Shift') {
            shift_pressed = false;
        }
    });
    
    document.addEventListener('keydown', function (event) {
        if (event.key === 'Shift') {
            shift_pressed = true;
        } else if (event.key === "Tab") {
            event.preventDefault();
            if (shift_pressed) {
                minus_indent();
            } else {
                plus_indent();
            }
        }
    });
    

    只要用户停留在我的选项卡上,这就非常有效。但是,当有人使用 控制+移位+制表符 要移动到浏览器中的上一个选项卡,请按 转移 在我的账单上,导致 shift_pressed 要成为的变量 true 。然后,他们在另一个选项卡上释放它,导致 shift_pressed 留下来 真的 ,即使他们回来了。然后他们需要发布 转移 再次修复。

    我决定,如果问题是 控制+移位+制表符 ,让我们也抓住控制权。所以我这样做了:

    document.addEventListener('keyup', function (event) {
        if (event.key === "Control") {
            ctrl = false;
        }
    
    document.addEventListener('keydown', function (event) {
        if (event.key === 'Shift') {
            if (!ctrl) {
                shift_pressed = true;
            }
        } else if (event.key === "Control") {
            ctrl = true;
        }
    

    只要人们浏览选项卡,这就行 只有 使用 控件+选项卡 控制+移位+制表符 。 当它们导航离开时, 控制 必须按下,并且当它们导航回来时, 控制 必须在我的标签上发布,所以这是有效的。

    问题是,如果有人使用 控制+移位+制表符 然后 shift_pressed 可以留下来 false 但是 ctrl 变成 真的 。如果他们然后导航回来,而不是 控件+选项卡 (将设置 ctrl 返回到 虚假的 )但是通过点击浏览器中的选项卡, ctrl 停留 真的 。这意味着 转移 被完全阻止使用,直到他们按下并释放 控制 再一次

    2 回复  |  直到 2 年前
        1
  •  2
  •   scrhartley    2 年前

    我认为你不需要自己滚。您只需检查现有 shiftKey 修饰符(a ctrlKey 修改的也存在)。

       if (event.key === "Tab") {
            event.preventDefault();
            if (event.shiftKey) {
                minus_indent();
            } else {
                plus_indent();
            }
        }
    

    https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/shiftKey
    https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ctrlKey

        2
  •  1
  •   Thomas Zimmermann    2 年前

    您可以确保在切换选项卡时重置布尔值,为此,您可以使用以下方法:

    document.addEventListener("visibilityChange", () => {
      if (document.visibilityState === "hidden") {
        shift_pressed = false;
        ctrl = false;
      }
    });