【问题标题】:Grouping results in JQuery UI Autocomplete plugin?JQuery UI自动完成插件中的分组结果?
【发布时间】:2016-12-29 20:48:37
【问题描述】:

我正在尝试使用自动完成功能跨多种类型的数据创建一些搜索功能。我希望每个自动完成建议都有自定义视图,以及根据类型对建议进行分组。这些组也应该分开。

如果我的解释不好,您可以在hotels.com 上查看搜索功能的示例:建议根据城市、地标、机场等进行分组。

我一直在查看 JQuery UI Autocomplete 插件,它似乎能够完成我需要的大部分工作,但我还没有看到任何分组示例。

由于我的 javascript/JQuery 技能有点欠缺,我希望这里有人能告诉我是否有可能实现我想要的 Autocomplete 插件,或者是否有其他插件可以解决问题?非常感谢您提供如何完成的示例/大纲。

【问题讨论】:

  • 自动完成类别示例听起来接近您所描述的内容:jqueryui.com/demos/autocomplete/#categories 查看源代码以了解他们如何设置示例。如果您从数据库中提取,只需将category var 添加到返回的结果中。然后 natedavisolds 的示例将为您提供所需的其余部分。
  • 啊。尽管看起来不像,但我一直在浏览演示,但显然我错过了那个。谢谢!

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


【解决方案1】:

您可以通过更改默认 _renderMenu 函数来覆盖自动完成的呈现方式。我通过(1)返回按类别排序的 json 结果和(2)覆盖此函数,做了与您所说的类似的事情。没有代码可以专门帮助您,但这是我自己的代码中的一个示例

$.widget( "custom.catcomplete", $.ui.autocomplete, {
        _renderMenu: function( ul, items ) {
            var self = this,
                currentCategory = "";
            $.each( items, function( index, item ) {
                if ( item.category != currentCategory ) {
                    ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" );
                    currentCategory = item.category;
                }
                self._renderItem( ul, item );
            });
        }
    });

【讨论】:

【解决方案2】:

我尝试了上述答案。但是,一个问题是,如果类别没有排序,例如

var availableTags = [
        {category: "favourite", label: "c#",         value: "c#", },
        {category: "other",     label: "Java",       value: "Java"},
        {category: "favourite", label: "JavaScript", value: "JavaScript"},
        {category: "other",     label: "J#",         value: "J#"},
    ];

它将创建重复的“收藏夹”和“其他”类别。

这是我为 jquery ui 自动完成分组创建的工作演示。即使项目的类别未按排序顺序,这也可以对项目进行分类。

http://jsfiddle.net/jooooice/qua87frd/

$(function(){
    
    var availableTags = [
        {category: "favourite", label: "c#",         value: "c#", },
        {category: "other",     label: "c++",        value: "c++"},
        {category: "other",     label: "c",          value: "c"},
        {category: "other",     label: "Java",       value: "Java"},
        {category: "favourite", label: "JavaScript", value: "JavaScript"},
        {category: "other",     label: "J#",         value: "J#"},
    ];
        
    var customRenderMenu = function(ul, items){
        var self = this;
        var categoryArr = [];
        
        function contain(item, array) {
            var contains = false;
            $.each(array, function (index, value) {
                if (item == value) {
                    contains = true;
                    return false;
                }
            });
            return contains;
        }
        
        $.each(items, function (index, item) {
            if (! contain(item.category, categoryArr)) {
                categoryArr.push(item.category);
            }
            console.log(categoryArr);
        });
        
        $.each(categoryArr, function (index, category) {
            ul.append("<li class='ui-autocomplete-group'>" + category + "</li>");
            $.each(items, function (index, item) {
                if (item.category == category) {
                    self._renderItemData(ul, item);
                }
            });
        });
    };
        
    $("#tags").tagit({
        autocomplete: {
            source: availableTags,
            create: function () {
                //access to jQuery Autocomplete widget differs depending 
                //on jQuery UI version - you can also try .data('autocomplete')
                $(this).data('uiAutocomplete')._renderMenu = customRenderMenu;
            }
        }
    })
});
.ui-autocomplete-group {
    line-height: 30px;
    background-color: #aaa;
}
.ui-menu-item {
    padding-left: 10px;
}
&lt;input id="tags" type="text" /&gt;

【讨论】:

    【解决方案3】:

    这是@natedavisolds 接受的答案,已更新以用于 Jquery UI 1.10。

      $.widget("custom.catcomplete", $.ui.autocomplete, {
        _renderMenu: function( ul, items ) {
          var that = this;
          var currentCategory = "";
          $.each( items, function( index, item ) {
            if (item.category != currentCategory) {
              $('<li/>').addClass('ui-autocomplete-category').html(convert_category(item.category)).appendTo(ul);
              currentCategory = item.category;
            }
            that._renderItemData( ul, item );
          });
        }   
      });
    

    【讨论】:

    • 函数convert_category()是做什么的?
    【解决方案4】:

    此外,您可以替换:

    ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" );
    

    与:

    ul.append( "<span class='ui-autocomplete-category'>" + item.category + "</span>" );
    

    否则你会在控制台看到很多错误,比如:n 未定义,或者 item 未定义...

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多