在ace编辑器上没有激活keydown事件

时间:2012-12-26 15:56:20

标签: ace-editor

ace编辑器可防止触发keydown事件。我认为preventDefault

如何在执行编辑器事件之前删除此预防或绑定到keydown事件?

2 个答案:

答案 0 :(得分:5)

ace仅停止已处理的事件, 你可以使用捕获事件监听器(editor.container.addEventListener(“keydown”,handler,true)) 或使用ace的命令处理程序

更新:阻止ace命令只有时候捕获事件处理程序才会起作用,但有时候ace hashHandler比关键码大转换更好

HashHandler = require("ace/keyboard/hash_handler").HashHandler
var turn = 0
var h = new HashHandler([{
    bindKey: "Up",
    descr: "Block cursor movement smetimes",
    exec: function(ed){
        turn++
        if (turn % 2)
            return false // allow other ace commands to handle event
    }
}])
editor.keyBinding.addKeyboardHandler(h)
// editor.keyBinding.removeKeyboardHandler(h)

或更紧凑的形式

var h = new HashHandler()
h.bindKeys({"Up": function(ed){...}})

答案 1 :(得分:3)

我还希望能够按顺序过滤光标键(并在弹出窗口中使用它们而不是它)。我能够使用以下代码注入此功能:

editor.keyBinding.origOnCommandKey = editor.keyBinding.onCommandKey;
editor.keyBinding.onCommandKey = function(e, hashId, keyCode) {
    if (...) { 
        this.origOnCommandKey(e, hashId, keyCode);
    }
}

keyCode 38代表向上光标,keyCode 40代表向下,13代表enter。如果未调用原始函数,Ace将不会看到此键按下。不幸的是,返回键仍由Ace使用。

使用类似的解决方案可以防止这种情况:

editor.keyBinding.origOnTextInput = editor.keyBinding.onTextInput;
editor.keyBinding.onTextInput = function(text) {
    if (...) {
        this.origOnTextInput(text);
    }
}
在这种情况下,

text是换行符。