9

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

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

我被困在这里。 我试图将 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"}
]
4

2 回答 2

10

尝试翻转它,所以在页面加载时你抓住它一次,然后实例化自动完成。

$(function() {
    $.ajax({
        url: "/path/to/cache.json",
        dataType: "json",
        data: {term: request.term},
        success: function(data) {
            var cat_data = $.map(data, function(item) {
                return {
                    label: item.label,
                    category: item.category,
                    desc: item.desc
                };
            });
            $("#searchfield").catcomplete({
                delay: 0,
                source: cat_data,
                minlength:0
            });
        }
    });
});
于 2013-03-29T01:29:02.837 回答
9

您的数据源引发解析错误,因为 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

于 2013-03-29T01:53:18.807 回答