Jquery UI自动完成:从一个数组的多个属性中搜索

时间:2013-04-06 03:26:12

标签: jquery jquery-ui jquery-ui-autocomplete

您好我正在尝试让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”,前两个元素应该弹出。


根据documentation

  

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

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

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

  •   
     

标签属性显示在建议菜单中。当用户选择项目时,将插入到input元素中。如果仅指定了一个属性,则它将用于两者,例如,如果仅提供属性,则也将用作标签< / strong>即可。

我如何(硬)编码,以便来源使用 2个标签labeldesc?)而不是标签


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

1 个答案:

答案 0 :(得分:11)

自动填充会接受third type of source这个函数,它可以以您认为合适的方式提供数据:

  

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

     
      
  • 具有单个术语属性的请求对象,该属性引用文本输入中当前的值。例如,如果用户输入   在城市领域的“新哟”,自动完成术语将等于“新哟”。
  •   
  • 响应回调,它需要一个参数:向用户建议的数据。应根据此数据过滤此数据   提供的术语,可以是上面描述的任何格式   简单的本地数据。提供自定义源时非常重要   回调以在请求期间处理错误。你必须经常打电话给   即使遇到错误也会回复回调。这确保了   小部件始终具有正确的状态。
  •   

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

$( "#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/