Ace编辑器,如何删除所有keyBinding但只有一个?

时间:2017-02-23 08:38:09

标签: javascript key-bindings ace-editor

我最近在我的jsp页面上有一个textarea

为此,我在键盘上有自己的快捷键

然后,我实现了ace编辑器,所有旧的键绑定都没有工作

然后我搜索了一会儿,发现了这段代码:

    //I did this before, to add the ace editor
    var editor = ace.edit("fileInfo");
    var JavaScriptMode = ace.require("ace/mode/javascript").Mode;
    editor.session.setMode(new JavaScriptMode()); 

   //Then I found this for the keyBindings
    delete editor.keyBinding;

最后一行,禁用ace编辑器中的所有keyBindings,我自己的keyBindings开始工作...... 一切都运行良好,但后来,我搜索了很多关于ace编辑器,并找到了一个有趣的选项,而且我是一个keyBinding,我喜欢使用,那就是DELETE ROW键绑定Ctrl + D

我现在想要取回它,但只有它,而不是其他的,而且我的旧keyBindings也应该有用......

旧的keyBindings的代码如下所示:

document.addEventListener("keydown", function(e) {
            // Ctrl + S = SAVE
            if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey))      {
                e.preventDefault();
                e.stopPropagation();
                if($scope.mode!='BROWSE')
                {
                    $('#saveBtn').trigger("click");
                }
            }
}, false);
你帮我吗?

1 个答案:

答案 0 :(得分:2)

delete editor.keyBinding;不是一个好的解决方案,它会在控制台

中产生错误消息
  

未捕获的TypeError:无法读取属性&c; ctrl-d'未定义的       在CommandManager.handleKeyboard(ace.js:10830)       在KeyBinding。$ callKeyboardHandlers(ace.js:4081)       在KeyBinding.onCommandKey(ace.js:4113)       在Editor.onCommandKey(ace.js:12424)       在normalizeCommandKeys(ace.js:1648)       在HTMLTextAreaElement。 (ace.js:1667)

选项1:删除所有绑定并重新定义我们需要的绑定。

//safely delete all bindings
editor.keyBinding.$defaultHandler.commandKeyBinding = {}
//bind the wanted command
editor.commands.addCommand({
    name: "removeline",
    bindKey: { win: "Ctrl-D", mac: "Command-D" },
    exec: function(editor) { editor.removeLines(); },
    scrollIntoView: "cursor",
    multiSelectAction: "forEachLine"
});

现在你已经定义了命令,你可以根据需要从你自己的代码中调用它:

editor.execCommand("removeline")

选项2:实际循环绑定。

使用for (key in obj)循环键绑定并删除不等于ctrl-dcommand-d的键:

for (key in editor.keyBinding.$defaultHandler.commandKeyBinding) {
    if (key !== "ctrl-d" && key !== "command-d")
        delete editor.keyBinding.$defaultHandler.commandKeyBinding[key]
}