2

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

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

4

2 回答 2

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){...}})
于 2012-12-28T09:16:12.503 回答
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 代表回车。如果不调用原始函数,Ace 将看不到此键按下。不幸的是,Ace 仍然使用返回键。

这可以通过类似的解决方案来防止:

editor.keyBinding.origOnTextInput = editor.keyBinding.onTextInput;
editor.keyBinding.onTextInput = function(text) {
    if (...) {
        this.origOnTextInput(text);
    }
}

在这种情况下,文本是换行符。

于 2013-02-06T08:41:19.943 回答