12

您好我正在尝试让 jQuery UI 自动完成小部件工作,以便它从我的数组的多个属性中搜索匹配项(不仅仅是默认情况下的一个)。

我已经搞砸了他们的例子,但是我仍然不确定如何解决这个问题。

http://jsfiddle.net/FUZPN/

这是我的数组格式script

var projects = [
    {
        value: "jquery",
        label: "jQuery",
        desc: "the write less, do more, JavaScript library",
        other: "9834275 9847598023 753425828975340 82974598823"
    },
    {
        value: "jquery-ui",
        label: "jQuery UI",
        desc: "the official user interface library for jQuery",
        other: "98 83475 9358 949078 8 40287089754 345 2345"
    },
    {
        value: "sizzlejs",
        label: "Sizzle JS",
        desc: "a pure-JavaScript CSS selector engine",
        other: "49857 2389442 573489057 89024375 928037890"
    }

我正在寻找的是,如果你输入“write”,第一个元素应该在自动完成中弹出,同样如果你输入“jq”,前两个元素应该弹出。


根据文档

数组:数组可用于本地数据。有两种支持的格式:

  • 字符串数组:[ "Choice1", "Choice2" ]

  • 具有标签和值属性的对象数组:[ { label: "Choice1", value: "value1" }, ... ]

标签属性显示在建议菜单中。当用户选择一个项目时,该将被插入到输入元素中。如果只指定了一个属性,它将用于两者,例如,如果您只提供属性,则该也将用作标签

我如何(硬)对其进行编码,以便源使用2 个标签labeldesc?)而不是一个标签


(对不起,我搜索了许多类似的问题,但是它们都针对多个来源,因为我只有 1 个数组,所以不在这里。是吗?)

4

1 回答 1

12

Autocomplete 接受第三种类型的 source,一个函数,它可以以任何你认为合适的方式提供数据:

第三种变体,回调,提供了最大的灵活性,可用于将任何数据源连接到自动完成。回调有两个参数:

  • 一个请求对象,具有单个 term 属性,它引用文本输入中当前的值。例如,如果用户在城市字段中输入“new yo”,则自动完成项将等于“new yo”。
  • 一个响应回调,它需要一个参数:向用户建议的数据。此数据应根据提供的术语进行过滤,并且可以采用上述任何简单本地数据的格式。在请求期间提供自定义源回调以处理错误时,这一点很重要。即使遇到错误,您也必须始终调用响应回调。这确保了小部件始终具有正确的状态。

这意味着你可以写这样的东西

$( "#project" ).autocomplete({
    source: function (request, response) {
        // request.term is what you typed
        console.log(request.term); 

        //call response with an array containing the filtered data
        response([...]); 
    }
});

一个简单的解决你的问题:

function lightwell(request, response) {
    function hasMatch(s) {
        return s.toLowerCase().indexOf(request.term.toLowerCase())!==-1;
    }
    var i, l, obj, matches = [];

    if (request.term==="") {
        response([]);
        return;
    }

    for  (i = 0, l = projects.length; i<l; i++) {
        obj = projects[i];
        if (hasMatch(obj.label) || hasMatch(obj.desc)) {
            matches.push(obj);
        }
    }
    response(matches);
}

$( "#project").autocomplete({
    source: lightwell
});

还有一个小提琴http://jsfiddle.net/FUZPN/5/

于 2013-04-06T10:21:50.523 回答