如何覆盖默认浏览器撤消操作

How to override default browser undo action

我实现了一个撤销管理器。 问题是页面包含输入文本

<script>
    $(document).keypress(function(event) {
        switch (event.which) {
        case 26:
            if (event.shiftKey && event.ctrlKey) {
                // Ctrl+Shift+z
                redo();
            }
            else if (event.ctrlKey) {
                // Ctrl+z
                undo();
            }
            break;
        }
    })
</script>
<input type="text">

然后,在编辑输入文本时,如果我通过键入 Ctrl+z 触发撤消事件,输入文本将被撤消,而不会调用我的撤消管理器。

我想强制浏览器在 Ctrl+z 上调用我的撤消管理器,即使页面包含文本字段或文本区域。

您需要监听 keydown 事件而不是 keypress。浏览器撤消会在按键按下时触发,但直到按键被抬起后按键才会发生。此外,如果您不希望浏览器自行撤消,则需要使用 event.preventDefault().

<script>
$(document).keydown(function(event) {
    switch (event.which) {
    case 90:
        if (event.shiftKey && event.ctrlKey) {
            // Ctrl+Shift+z
            event.preventDefault();
            redo();
        }
        else if (event.ctrlKey) {
            // Ctrl+z
            event.preventDefault();
            undo();
        }
        break;
    }
})
</script>