【问题标题】:Detecting ctrl+z (and other control combos) in paper.js在 paper.js 中检测 ctrl+z(和其他控制组合)
【发布时间】:2015-06-18 18:46:05
【问题描述】:

我正在尝试在我的 paper.js 应用程序中启用编辑命令(例如 CTRL+z 用于“撤消”)。

检测单个字母键效果很好,我可以检测鼠标事件期间按住的修饰键,但我无法编写检测 CTRL 和字母键组合的事件处理程序。

基于the examples given by fabric.js,我期望的是一个看起来像这样的密钥处理程序:

function onKeyDown(event) {
    if (event.key == 'z' && event.modifiers.control){
       //do a thing!
    }
}

但是,这不起作用!奇怪的是,条件块永远不会触发。为了调查这一点,我编写了以下诊断处理程序...

function onKeyDown(event) {
    console.log(event.key);
    console.log(event.modifiers.control);
}

...并尝试了各种键盘输入并获得了一些有趣的结果:

CTRL 仅键

   Key: control
   Control: true

z 仅键

Key: z
Control: false
按住 CTRL 的同时按下

z

Key: 
Control: true

这些结果表明event.key 返回的字符串会有所不同,具体取决于在键入另一个键时是否按住了控件修饰符。这里发生了一些奇怪的事情!

基于此,如何检测这两个键同时被按下?

【问题讨论】:

    标签: javascript keyevent undo paperjs ctrl


    【解决方案1】:

    以下是一些可以帮助您的原生 Javascript 解决方案:

    解决方案 1

    使用本机事件对象检查按下了哪个键码以及是否按下了 shiftkey。

    function handleKeyDown(evt) {
        if (evt.which === 90 && evt.shiftKey) {
            // do a thing!
        }
    };
    

    解决方案 2

    保留一个全局变量以检测 shift 键是否按下并在您的 keydown 处理程序中使用它。您还需要使用 keyup 事件处理程序重置它。

    var shiftKeyDown = false;
    
    function handleKeyDown(evt) {
        if (evt.which === 17) {
            shiftKeyDown = true;
        } else if (evt.which === 90 && shiftKeyDown) {
            // do a thing!
        }
    };
    
    function handleKeyUp(evt) {
        if (evt.which === 17) {
            shiftKeyDown = false;
        }
    };
    

    【讨论】:

    • 这里的麻烦是event.key返回的字符串实际上是不同的,这取决于是否按住CTRL。 Shift 更容易(这是我实现的第一件事!)因为它不会改变key 的值。即使您为 CTRL 创建了一个全局布尔值并将其映射到 keyUp/keyDown 事件,您仍然无法通过查找 event.key == 'z' 来检测 CTRL+Z 字符,因为 z 永远不会被 @987654327 返回@ 只要按住 CTRL。理论上,每次按下该键时,您都可以使全局 CTRL 布尔值切换,但这很奇怪。 :)
    • 这就是为什么我建议使用whichkeyCode 而不是key,如我的示例所示。每个键都表示为一个唯一的数字。这些属性现在被认为已弃用,但根据您可能需要支持的浏览器,它们将是最普遍有用的,并且所有未来的浏览器都将支持它们以用于遗留用途。
    • 如果我正在编写一个普通的 JavaScript 处理程序,我会倾向于同意你的观点!在这种情况下,我试图坚持使用 paper.js 库提供的事件处理程序,它不会让您直接访问由事件处理程序产生的 keyCode。但你是对的,在这种情况下你真正想要的是 event.keyCode,如果它可用的话!
    【解决方案2】:

    TL;DR:可以使用event.key.charCodeAt(0)检测CTRL+Z返回的奇怪字符码CTRL+组合键。


    事实证明,CTRL+z 组合是special

    在这种情况下返回的密钥...

    z 按住控制键

    Key: 
    Control: true
    

    ... 看起来像一个空字符串,因为传递给事件处理程序的键码对应于特殊的 CTRL+z 组合,这会导致无法打印的字符.

    为了检测这个特殊字符,我修改了诊断处理程序...

     function onKeyDown(event){
         console.log("Key: " + event.key);
         console.log("Control: " + event.modifiers.control);
         console.log("KeyCode: " + event.key.charCodeAt(0));
     }
    

    ...并测试了与以前相同的键盘组合:

    CTRL 仅键

     Key: control
     Control: true
     KeyCode: 99
    

    z 仅键

     Key: z
     Control: false
     KeyCode: 122
    
    按住 CTRL 的同时按下

    z

     Key: 
     Control: true
     KeyCode: 26
    

    这意味着特殊的 CTRL 组合键可以使用这样的事件处理程序来检测:

    function onKeyDown(event) {
        if (event.key.charCodeAt(0) == 26){ // detect the special CTRL-Z code
            // do a thing! 
        }
    }
    

    需要注意的是,这种方法不能单独检测控制键,因为99不是CTRL的字符,而是"c"的第一个字符在event.key 返回的字符串"control" 中。为此,您仍然需要使用event.modifiers.control

    【讨论】:

      【解决方案3】:
      function onKeyDown(event) {
      if (event.event.ctrlKey && event.key == "z") {
          //do something
         }
      }
      

      这应该可行。

      【讨论】:

        猜你喜欢
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 2017-10-14
        • 1970-01-01
        • 2021-04-11
        • 2012-04-19
        • 2011-08-23
        相关资源
        最近更新 更多