我正在尝试添加一个自定义的自动完成,我想在用户输入时触发它(当然是可配置的)。我找到了几个codemirror的自动补全示例:
http://codemirror.net/demo/complete.html和http://codemirror.net/demo/xmlcomplete.html
但是这两个都是在特定的键上触发的(一个是Control Space,另一个是'<‘),并且都使用extraKeys功能来处理事件,但我想从任何键触发。我尝试过以下几种方法:
var editor = CodeMirror.fromTextArea(document.getElementById("code"),
{
lineNumbers: true,
mode: "text/x-mysql",
fixedGutter: true,
gutter: true,
// extraKeys: {"'.'": "autocomplete"}
keyup: function(e)
{
console.log('testing');
},
onkeyup: function(e)
{
console.log('testing2');
}
});但一直没有运气。关于如何从任何keyup事件触发,有什么建议吗?
发布于 2012-12-07 05:54:51
备注:此答案适用于CodeMirror的最新版本。
onKeyEvent: function(e , s){
if (s.type == "keyup")
{
console.log("test");
}
}发布于 2015-10-09 01:01:42
对于5.7版本,之前提出的两种解决方案都不适合我(我认为它们甚至在更早的版本中也有错误)。我的解决方案
myCodeMirror.on("keyup", function (cm, event) {
if (!cm.state.completionActive && /*Enables keyboard navigation in autocomplete list*/
event.keyCode != 13) { /*Enter - do not open autocomplete list just after item has been selected in it*/
CodeMirror.commands.autocomplete(cm, null, {completeSingle: false});
}
});工作原理:
仅当自动完成弹出窗口尚未打开时,才会打开该弹出窗口(否则,键盘导航将导致重新打开弹出窗口,同时再次选择第一项)。
当你点击Enter时,你想要关闭弹出窗口,所以这是一个不应该触发自动完成的字符的特殊情况(你可以考虑一个情况,当你想显示空行的自动完成时)。
最后一个修复是设置completeSingle: false,这可以防止你在输入某个单词时出现大小写,中间会自动完成,然后你可以通过反射继续输入。因此,用户将始终需要从弹出窗口中选择所需的字符串(即使是单个选项)。
发布于 2015-11-25 13:21:04
最类似于智能感知的行为可以通过以下方式实现:
var ExcludedIntelliSenseTriggerKeys =
{
"8": "backspace",
"9": "tab",
"13": "enter",
"16": "shift",
"17": "ctrl",
"18": "alt",
"19": "pause",
"20": "capslock",
"27": "escape",
"33": "pageup",
"34": "pagedown",
"35": "end",
"36": "home",
"37": "left",
"38": "up",
"39": "right",
"40": "down",
"45": "insert",
"46": "delete",
"91": "left window key",
"92": "right window key",
"93": "select",
"107": "add",
"109": "subtract",
"110": "decimal point",
"111": "divide",
"112": "f1",
"113": "f2",
"114": "f3",
"115": "f4",
"116": "f5",
"117": "f6",
"118": "f7",
"119": "f8",
"120": "f9",
"121": "f10",
"122": "f11",
"123": "f12",
"144": "numlock",
"145": "scrolllock",
"186": "semicolon",
"187": "equalsign",
"188": "comma",
"189": "dash",
"190": "period",
"191": "slash",
"192": "graveaccent",
"220": "backslash",
"222": "quote"
}
EditorInstance.on("keyup", function(editor, event)
{
var __Cursor = editor.getDoc().getCursor();
var __Token = editor.getTokenAt(__Cursor);
if (!editor.state.completionActive &&
!ExcludedIntelliSenseTriggerKeys[(event.keyCode || event.which).toString()] &&
(__Token.type == "tag" || __Token.string == " " || __Token.string == "<" || __Token.string == "/"))
{
CodeMirror.commands.autocomplete(editor, null, { completeSingle: false });
}
});https://stackoverflow.com/questions/13744176
复制相似问题