中间单词的自动完成(jQuery UI)

Jus*_*ant 4 jquery-ui jquery-ui-autocomplete

任何人都知道使用 jQuery UI 的自动完成小部件的良好示例代码,该小部件可以在文本框中间自动完成单词,而不仅仅是在末尾自动完成单词?

我正在将 jquery UI 自动完成小部件用于支持输入多个标签的组件。这就像堆栈溢出的标签编辑器,但更简单:自动完成下拉菜单中没有花哨的格式,编辑框中没有“标签”背景图像。我从jQuery UI Autocomplete Multiple 示例开始并对其进行了修改。

它工作正常,除了自动完成对多标签字符串中间的标签不起作用。例如,如果我键入C Fortran然后在后面加上插入符号C并键入+,我希望C++在自动完成列表中看到,但我又看到Fortran了。

这是到目前为止的代码:http : //jsfiddle.net/WCfyB/4/

这与autocomplete in middle of text (如 Google Plus)所描述的问题相同,但该问题中的问题更简单,因为他可以依靠@文本中的空白来指示何时显示自动完成。就我而言,我不能仅仅依赖于文本——我实际上需要找出插入符号的位置并自动完成插入符号所在的单词。

我可以使用 caret 或其他插件自己构建它,但想知道是否已经有一个基于 jQuery-UI 的在线示例,我可以使用它而无需重新发明另一个轮子,特别是如果需要担心特定于浏览器的极端情况。理想情况下,它的行为是这样的:每当用户将插入符号放在标签内部或末尾(标签总是用 1+ 空格分隔)时,就会为该标签显示自动完成。知道一个好的样本吗?

And*_*ker 5

我不知道任何这样的例子,但这里有一些你可以开始的东西:

var availableTags = [ ... ]; 

function split(val) {
    return val.split(/ \s*/);
}

function extractLast(term) {
    return split(term).pop();
}

$("#tags")
    .bind("keydown", function(event) {
        // don't navigate away from the field on tab when selecting an item
        if (event.keyCode === $.ui.keyCode.TAB
                                   && $(this).data("autocomplete").menu.active) {
            event.preventDefault();
        }
    })
    .autocomplete({
        minLength: 0,
        source: function(request, response) {
            var results = [],
                selectionStart = this.element[0].selectionStart
                term = extractLast(request.term.substring(0, selectionStart));

            if (term.length > 0) {
                results = $.ui.autocomplete.filter(availableTags, term);
            }
            response(results);
        },
        focus: function() {
            return false; // prevent value inserted on focus
        },
        select: function(event, ui) {
            var terms = split(this.value.substring(0, this.selectionStart));
            terms.pop();  // remove the current input
            terms.push(ui.item.value);        // add the selected item
            this.value =
                $.trim(terms.join(" ") + this.value.substring(this.selectionStart)) + " ";
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

示例: http : //jsfiddle.net/WCfyB/7/

这里的主要警告是该selectionStart方法在 IE 中不起作用。您可以使用您在问题中提到的插件之一替换这些函数调用。