在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 时,页面命令会立即 运行,例如在按键事件甚至开始之前。