在Safari中拦截CMD+Z、CMD+SHIFT+Z和CMD+Y
Intercepting CMD+Z, CMD+SHIFT+Z and CMD+Y in Safari
我正在帮助一家公司在 WYSIWYG 编辑器中调试其 undo/redo 功能的一些问题。不幸的是,Safari 似乎吞噬了 CMD+Z 击键,它永远不会进入按键回调。
有没有办法检测 Javascript 中的这些击键并防止默认操作? (编辑器有自己的 undo/redo 堆栈)。
更新
对不起,我应该说当浏览器本机撤消堆栈为空时,我可以拦截 CMD+Z contenteditable 不是重点。不然好像没触发没冒泡。
我遇到了一个奇怪的情况。我的原始代码并没有阻止事件冒泡:
evt.preventDefault();
evt.stopPropagation();
当我添加这个并刷新页面时,浏览器仍在拦截击键。
我只是偶然发现,如果我关闭浏览器选项卡并打开一个新的到我的测试页面,浏览器一定重置了一些东西,现在我能够拦截并停止默认 Undo/Redo 功能:
使用按键事件:
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;
}
}
工作愉快:)
仅 event.preventDefault()
就足以拦截 Safari。需要注意的关键是你必须在 keyup
而不是 keydown.
上进行
在 Safari 中,当您按下 CMD-Z 时,页面命令会立即 运行,例如在按键事件甚至开始之前。
我正在帮助一家公司在 WYSIWYG 编辑器中调试其 undo/redo 功能的一些问题。不幸的是,Safari 似乎吞噬了 CMD+Z 击键,它永远不会进入按键回调。
有没有办法检测 Javascript 中的这些击键并防止默认操作? (编辑器有自己的 undo/redo 堆栈)。
更新
对不起,我应该说当浏览器本机撤消堆栈为空时,我可以拦截 CMD+Z contenteditable 不是重点。不然好像没触发没冒泡。
我遇到了一个奇怪的情况。我的原始代码并没有阻止事件冒泡:
evt.preventDefault();
evt.stopPropagation();
当我添加这个并刷新页面时,浏览器仍在拦截击键。
我只是偶然发现,如果我关闭浏览器选项卡并打开一个新的到我的测试页面,浏览器一定重置了一些东西,现在我能够拦截并停止默认 Undo/Redo 功能:
使用按键事件:
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;
}
}
工作愉快:)
event.preventDefault()
就足以拦截 Safari。需要注意的关键是你必须在 keyup
而不是 keydown.
在 Safari 中,当您按下 CMD-Z 时,页面命令会立即 运行,例如在按键事件甚至开始之前。