我正在使用jquery-ui-autocomplete(实际上,catcomplete附加到搜索框)。只要我使用静态定义的项目数组作为源,它就可以正常工作。

出于性能原因,我不希望自动完成功能将Ajax请求发送到对MySQL发出%like%请求的PHP脚本。因此,我从数据库生成了一个JSON文件,其中包含可以在搜索中匹配的所有项目(许多sql表中约有20-30个项目)。在页面加载时或用户开始在搜索框中键入内容时,我只想读取/解析一次文件。

我被困在这里。
我试图将Ajax调用附加到.catcomplete()(下面的代码)。我还尝试进行getJSON调用,并在其success()方法中创建.catcomplete。
两种方法都无声地失败。

我对JS / jQuery有点陌生,我已经喜欢了,但是我有点迷路了。任何有用的文档的帮助/解决方案/指针将不胜感激。

非常感谢你!

这是HTML :(非常简单)

<form id="searchform" method="get" role="search">
    <input id="searchfield" />
    <input type="submit" name="go" value="go!" />
</form>


这是我的JS代码:

$( "#searchfield" ).catcomplete({
delay: 0,
source: function( request, response ) {
    $.ajax({
        url: "/path/to/cache.json",
        dataType: "json",
        data: {term: request.term},
        success: function(data) {
            response($.map(data, function(item) {
                return {
                    label: item.label,
                    category: item.category,
                    desc: item.desc
                };
            }));
        }
    });
},
minlength:0
});


样本JSON数据:

[
{ label: "lbl1", category: "cat1", desc: "desc1"},
{ label: "lbl2", category: "cat1", desc: "desc2"},
{ label: "lbl3", category: "cat1"}
]

最佳答案

由于json格式不正确,因此您的数据源引发了解析错误,在json中,密钥也必须包含在"中。

{
  "list" : [{
                "label" : "lbl1",
                "category" : "cat1",
                "desc" : "desc1"
            }, {
                "label" : "lbl2",
                "category" : "cat1",
                "desc" : "desc2"
            }, {
                "label" : "lbl3",
                "category" : "cat1"
            }]
}


演示:Plunker

如果您希望基于请求字词进行搜索,那么您将不得不进行更多更改

  var xhr;
  $( "input" ).catcomplete({
    delay: 0,
    source: function( request, response ) {
      var regex = new RegExp(request.term, 'i');
      if(xhr){
        xhr.abort();
      }
      xhr = $.ajax({
          url: "data.json",
          dataType: "json",
          cache: false,
          success: function(data) {
            response($.map(data.list, function(item) {
              if(regex.test(item.label)){
                return {
                    label: item.label,
                    category: item.category,
                    desc: item.desc
                };
              }
            }));
          }
      });
    },
    minlength:0
  });


演示:Plunker

07-27 13:45