Javascript 拦截CMD+;Z、 CMD+;班次+;Z和CMD+;游猎中的迷幻
我正在帮助一家公司调试所见即所得编辑器中的撤销/重做功能的一些问题。不幸的是,Safari似乎吞下了CMD+Z键,而且它永远不会到达keydown回调 有没有办法在Javascript中检测这些击键并阻止默认操作?(编辑器有自己的撤消/重做堆栈) 更新Javascript 拦截CMD+;Z、 CMD+;班次+;Z和CMD+;游猎中的迷幻,javascript,safari,dom-events,keydown,Javascript,Safari,Dom Events,Keydown,我正在帮助一家公司调试所见即所得编辑器中的撤销/重做功能的一些问题。不幸的是,Safari似乎吞下了CMD+Z键,而且它永远不会到达keydown回调 有没有办法在Javascript中检测这些击键并阻止默认操作?(编辑器有自己的撤消/重做堆栈) 更新 抱歉,我应该说,当浏览器本机撤消堆栈为空时,或者当输入或contenteditable未处于焦点时,我可以拦截CMD+Z。否则它似乎不会被触发或冒泡。我遇到了一个奇怪的情况。我的原始代码并没有阻止事件冒泡: evt.preventDefault(
抱歉,我应该说,当浏览器本机撤消堆栈为空时,或者当输入或contenteditable未处于焦点时,我可以拦截CMD+Z。否则它似乎不会被触发或冒泡。我遇到了一个奇怪的情况。我的原始代码并没有阻止事件冒泡:
evt.preventDefault();
evt.stopPropagation();
当我添加这个并刷新页面时,浏览器仍在拦截击键
我只是偶然发现,如果我关闭浏览器选项卡并在测试页面上打开一个新的选项卡,浏览器肯定重置了某些内容,现在我能够拦截并停止默认的撤消/重做功能:
使用keydown事件:
if (evt.metaKey || evt.ctrlKey) {
switch (evt.which) {
case 89: // redo, CMD+Y
evt.preventDefault();
evt.stopPropagation();
// Do your Redo stuff
break;
case 90:
if (evt.shiftKey) { // redo, CMD+SHIFT+Z
evt.preventDefault();
evt.stopPropagation();
// Do your Redo stuff
} else { // undo, CMD+Z
evt.preventDefault();
evt.stopPropagation();
// Do your Undo stuff
}
break;
}
}
处理:)事件。仅preventDefault()
就足以拦截Safari。需要注意的关键是,您必须在keyup
上执行此操作,而不是在keydown上执行此操作
在Safari中,当您点击CMD-Z时,页面命令会立即运行,例如在按键事件开始之前。检测,是()。预防,可能不是。我发现这个项目可以捕获cmd+z,并且可以阻止它冒泡:不幸的是,我还不能解释它是如何成功的,所以我可以只提取我需要的一点。我不明白
keyup
发生在keydown
之后,这会有什么帮助呢?如果有人像我一样浏览过,关键是在测试更改之前关闭浏览器选项卡并重新打开。一定是某种狩猎虫。