【问题标题】:jQuery UI Autocomplete using a static json file as source使用静态 json 文件作为源的 jQuery UI 自动完成
【发布时间】:2013-03-29 01:22:50
【问题描述】:

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

出于性能原因,我不希望自动完成功能将 Ajax 请求发送到 PHP 脚本,从而向 MySQL 发出 %like% 请求。因此,我从数据库生成了一个 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"}
]

【问题讨论】:

    标签: json jquery-ui jquery jquery-autocomplete


    【解决方案1】:

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

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

    【讨论】:

    • 这个答案对我很有帮助(非常感谢)。实际上,我在使用 JSON 文件时遇到了问题(属性名称周围缺少“”...),这种语法帮助我指出了这一点。一切正常。再次感谢!
    • 很好的提示,特别是对于较大的 JSON 文件!
    • @joe-frambach 我们可以在这种语法中使用限制吗?假设每次我需要最多 10 个结果?
    【解决方案2】:

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

    【讨论】:

    • 实际上,我设法在_renderItemData 上使用monkeypatch 跳过了正则表达式部分(这似乎只涉及匹配项)。我将您的答案标记为最佳答案,因为我真正的问题是 JSON 文件中的引号。非常感谢您指出这一点!
    猜你喜欢
    • 2017-12-03
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2018-01-18
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多