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

时间:2012-01-05 22:58:35

标签: jquery-ui jquery-ui-autocomplete

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

我正在为支持输入多个标签的组件使用jquery UI自动完成小部件。它就像堆栈溢出的标签编辑器,但更简单:自动完成下拉列表中没有花哨的格式,编辑框中没有“标签”背景图像。我从jQuery UI Autocomplete Multiple sample开始修改它。

它工作正常,但自动完成功能不适用于多标签字符串中间的标签。例如,如果我输入C Fortran,然后在C之后放置插入符号并输入+,我希望在自动填充列表中看到C++但我看到了再次Fortran

以下是目前的代码:http://jsfiddle.net/WCfyB/4/

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

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

1 个答案:

答案 0 :(得分:3)

我不知道这样的任何例子,但是你可以从这里开始:

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;
        }
    });

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

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