Ace编辑器:为什么键盘事件处理程序被调用两次?

时间:2018-02-06 05:02:09

标签: javascript ace-editor

目前,我正在通过此javascript代码在我的ace编辑器中按下任何键时捕获键盘事件:

editor.keyBinding.addKeyboardHandler({
    handleKeyboard: function(data, hash, keyString, keyCode, event) {
        console.log(ketString)
        ...
    }

问题是每次在ace编辑器中按下一个键时,处理函数被称为两次,但是我希望它被调用一次。有什么想法吗?

修改

根据@Michael Geary的反馈,我每次调用键盘处理程序时都添加了一个console.trace(),并且我已经跟踪了ace.js代码中两个位置的调用:

this.onCommandKey = function(e, t, n) {
    var i = r.keyCodeToString(n);
    this.$callKeyboardHandlers(t, i, n, e)      <-----------
}
,
this.onTextInput = function(e) {
    this.$callKeyboardHandlers(-1, e)           <-----------
}

问题是,为什么onCommandKeyonTextInput都被触发了?

1 个答案:

答案 0 :(得分:1)

他们用不同的hashid调用它,并且通常使用不同的键串。第一个调用是keypress事件,其中hashid是https://github.com/ajaxorg/ace/blob/55f206452dd2ebd4094edbae7a145bfb09da87bb/lib/ace/keyboard/hash_handler.js#L225中所见的修饰键的组合。 第二个是带有hashid=-1

的textinput事件