我终于自己解决了这个问题。我不是 JS 专家,但我会分享我的解决方案,以防它对其他人有用。
重要提示:我从this project 获得了原始代码。该项目具有 Angular 和 Angular-codemirror 依赖项。我没有在我的应用程序的任何地方使用 Angular,所以我提取并调整它以在没有 Angular 的情况下使用它。
目标是能够定义将用于自动完成的单词字典/地图。解决方案非常简单。在myTextAreaId 元素的父级中,您必须像这样创建一个 span/div:
<div class="codeMirrorDictionaryHintDiv" codemirror-dictionary-hint="[ 'Soccer', 'Cricket', 'Baseball', 'Kho Kho' ]"></div>
然后...代码,将使用 css 类 codeMirrorDictionaryHintDiv 查找 closest 元素,将提取属性 codemirror-dictionary-hint,将评估它以便从中获取 Javascript 数组,然后简单地设置作为提示函数的输入字典。
代码是:
var dictionary = [];
try {
// JSON.parse fails loudly, requiring a try-catch to prevent error propagation
var dictionary = JSON.parse(
document.getElementById('myTextAreaId')
.closest('.codeMirrorDictionaryHintDiv')
.getAttribute('codemirror-dictionary-hint')
) || [];
} catch(e) {}
// Register our custom Codemirror hint plugin.
CodeMirror.registerHelper('hint', 'dictionaryHint', function(editor) {
var cur = editor.getCursor();
var curLine = editor.getLine(cur.line);
var start = cur.ch;
var end = start;
while (end < curLine.length && /[\w$]/.test(curLine.charAt(end))) ++end;
while (start && /[\w$]/.test(curLine.charAt(start - 1))) --start;
var curWord = start !== end && curLine.slice(start, end);
var regex = new RegExp('^' + curWord, 'i');
return {
list: (!curWord ? [] : dictionary.filter(function(item) {
return item.match(regex);
})).sort(),
from: CodeMirror.Pos(cur.line, start),
to: CodeMirror.Pos(cur.line, end)
}
});
CodeMirror.commands.autocomplete = function(cm) {
CodeMirror.showHint(cm, CodeMirror.hint.dictionaryHint);
};