检测纸张中的 ctrl+z(和其他控制组合.js
Detecting ctrl+z (and other control combos) in paper.js
我正在尝试在我的论文.js应用程序中启用编辑命令(例如 CTRL+z 表示"撤消")。
检测单个字母键效果很好,我可以检测鼠标事件期间持有的修饰键,但我在编写检测 CTRL 和字母键组合的事件处理程序时遇到问题。
根据 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解决方案应该可以帮助你:
解决方案 1
使用本机事件对象检查按下了哪个键码,以及 shift 键是否按下。
function handleKeyDown(evt) {
if (evt.which === 90 && evt.shiftKey) {
// do a thing!
}
};
解决方案 2
保留一个全局变量来检测 shift 键是否关闭,并在键下处理程序中使用它。您还需要使用 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;
}
};
TL;DR:您可以使用event.key.charCodeAt(0)
来检测 CTRL+Z 和其他 CTRL+组合键返回的奇怪字符代码。
事实证明,CTRL+z 组合很特别。
在这种情况下返回的密钥...
按住控制时的 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"
的字符,字符串中的第一个字符"control"
由 event.key
返回。为此,您仍然需要使用 event.modifiers.control
.
function onKeyDown(event) {
if (event.event.ctrlKey && event.key == "z") {
//do something
}
}
这应该有效。
- 如何添加浮动和非浮动,其他
- 与其他库的jQuery.noConflict()
- 播放当前视频时如何停止其他视频?JavaScript
- 剑道UI内联编辑:如何在点击其他按钮时隐藏按钮
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- JS编译器/包管理器,用于版本控制
- 除修剪外的其他功能
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- Array.length似乎不起作用;console.log则显示其他情况
- 如何消除代码中的未定义和其他问题
- 如何在其他样式中控制我的
样式
- 控制立方体或其他几何体的每个面,分为三.js
- 在某些情况下没有“访问控制-允许源”标头错误,但在其他情况下则没有
- 在三个JS中缩放相机,没有轨迹球控制或其他相机控制库
- 变量在控制台中更新.log但不在其他函数中更新
- 如何从其他指令控制表单的有效性
- 在单个效果表达式中控制其他效果
- 检测纸张中的 ctrl+z(和其他控制组合.js
- JQuery DatePicker绑定控件可以'不得包含在其他控制中