无法将 Jquery-ui 自动完成链接到 JSON 文件

Posted

技术标签:

【中文标题】无法将 Jquery-ui 自动完成链接到 JSON 文件【英文标题】:Cannot link Jquery-ui autocomplete to JSON file 【发布时间】:2016-06-22 07:19:17 【问题描述】:

我知道这个问题以前被问过,但是通过查看其他主题,我仍然找不到解决问题的方法。

这里是相关的JS代码+问题的plunk;

    $('#test').autocomplete(
            source: function(request, response) 
                $.ajax(
                    url: "brands.json",
                    dataType: 'json',
                    data: request,
                    success: function(data) 
                        response($.map(data, function(item) 
                            return (item.brands)
                        ));
                    
                );
            ,

普朗克:

https://plnkr.co/edit/qEZnuszj7JkNy1NrGyCd?p=preview

如您所见,我无法检索 .JSON 文件中所述的任何数据。

任何帮助将不胜感激,

谢谢

【问题讨论】:

为什么不只是 return data.brands; 在 response() 中? 第 53 行关闭 $(document).ready(); 错误。第 52 行应为:, 100);,第 53 行应为:); 我在您的 html 中没有看到 ID 为 test 的元素。 【参考方案1】:

与我制作的其他 cmets 一起,我在 JSFiddle 中制作了一个工作示例:https://jsfiddle.net/Twisty/xp43u291/

HTML

<input name="myList" id="test">
<span id="#message"></span>

JavaScript

$(document).ready(function() 
  setTimeout(function() 
    $('#test').autocomplete(
      source: function(request, response) 
        $.ajax(
          url: "brands.json",
          dataType: "JSON",
          type: "GET",
          success: function(resp) 
            console.log("Find '", request.term, "' in ", resp.brands);
            var results = [];
            $.each(resp.brands, function(k, v) 
              if (v.indexOf(request.term) == 0) 
                results.push(v);
              
            );
            response(results);
          
        );
      ,
      autoFocus: true,
      minLength: 3,
      response: function(event, ui) 
        if (!ui.content.length) 
          var noResult = 
            value: "",
            label: "No results found"
          ;
          ui.content.push(noResult);
         else 
          $("#message").empty();
        
      
    );

    var render = $('#test').autocomplete('instance')._renderMenu;
    $('#test').autocomplete('instance')._renderMenu = function(ul, items) 
      items.push(
        label: 'OTHER BRAND',
        value: 'OTHER BRAND',
        last: true
      );
      render.call(this, ul, items);
    ;
  , 100);
);

首先,您不想使用$(document).ready();$(function());。使用其中一种。

其次,由于您调用的是 JSON 文件而不是脚本,因此没有任何内容可以传递给文件本身。所以我们删除了data 选项。

第三,在success,我们期望 JSON 数据作为对象返回。 IT 将返回所有数据,我们希望将其配对到与我们的request.term 或已输入的字符串匹配的结果。你可以通过多种方式做到这一点,我使用了一个简单的循环,使用.indexOf()。如果您希望它在整个短语中而不是在开头搜索,您也可以将其从 ==0 更改为 &gt;=0

我希望这有助于为您解决这个问题。如果没有,请评论或更新您的帖子。

【讨论】:

您好,感谢您到目前为止的帮助 - 您的代码看起来比我的要干净得多!当我在您的 plnkr 上搜索“dom”或 JSON 文件中包含的内容时,它仍然没有显示正确的结果吗?它只是继续返回未找到结果/其他品牌列表选项。 那么你需要大写搜索。 .indexOf() 区分大小写。如果您搜索“DOM”,它会立即出现。所以要么更新你的数据,要么转换使用request.term.toUpperCase();我喜欢漂亮的代码,如果你曾经在 Python 中工作,你必须正确格式化。所以我只是到处做。加上“整洁”功能有很大帮助;) 啊好吧!我现在一切正常,再次感谢您的回答,它解释得很好,似乎是一个非常复杂的解决方案!

以上是关于无法将 Jquery-ui 自动完成链接到 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套属性的 Rails Jquery-ui 自动完成

如何将 jquery-ui 的自动完成选择映射到 POST 上的 Java 类

使用带有多个输入字段的 jquery-ui 自动完成

自动完成不适用于值数组

jQuery-ui 自动完成,选择第一项

jQuery-UI 自动完成不会显示在 jQuery-UI 对话框中