请参见最后的修改
我刚刚开始使用CodeMirror进行项目,而且我遇到了一个我完全不理解的问题。
问题是要处理CodeMirror的事件,特别是"select"
事件,因为我正在处理"change"
事件而没有问题我无法猜测发生了什么。
让我们看一些代码;我将CodeMirror对象包装到另一个对象中,它看起来类似于:
function expressionEditor(config)
{
jQuery('#divEditor').append('<textarea id="expression"/>');
this.editor = CodeMirror.fromTextArea(document.getElementById('expression'),
{
mode: 'custom',
lineNumbers: true,
extraKeys: {'Ctrl-Space': 'autocomplete'}
});
this.OnChange = function(instance, object)
{
if (object.text[0] === '.')
{
CodeMirror.showHint(this.editor, CodeMirror.hint.custom);
}
};
this.OnSelectHint = function(completion, Element)
{
alert(completion + ' : ' + Element);
};
CodeMirror.on(this.editor, 'change', jQuery.proxy(this.OnChange, this));
CodeMirror.on(this.editor, 'select', jQuery.proxy(this.OnSelectHint, this));
}
正如我所说的,事件"change"
按预期工作,当我在编辑器中写一个点时,它调用函数this.OnChange
来调用提示列表,但是当我浏览建议的提示时{永远不会调用{1}}函数(导航器上不会弹出this.OnSelectHint
)。
根据CodeMirror documentation关于alert
事件,回调必须是“在选择完成时触发。传递完成值(字符串或对象)和表示它的DOM节点在菜单中“。
由于其他事件正在发挥作用,我完全迷失了...对于发生了什么事的任何线索?
如Marijn所述,CodeMirror中没有"select"
事件; "select"
事件来自"select"
CodeMirror插件。只是为了知道:
答案 0 :(得分:1)
CodeMirror API中没有"select"
事件。因此,倾听它绝对不会做任何事情。
答案 1 :(得分:1)
问题是来自"select"
的{{1}}事件是在自动完成建议数组上触发的,而不是在CodeMirror编辑器本身上触发的。
如here所述,您可以通过包装show-hint
函数在该对象上设置事件处理程序。例如,使用show-hint
插件:
sql-hint
这里 const sqlHint = CodeMirror.hint.sql;
CodeMirror.hint.sql = (cm, options) => {
const result = sqlHint(cm, options);
if (result) {
CodeMirror.on(result, 'shown', onAutocompleteShown);
CodeMirror.on(result, 'select', onAutocompleteSelect);
}
return result;
}
和onAutocompleteShown
是事件处理程序。