【问题标题】:Displaying JQuery UI autocomplete as a table将 JQuery UI 自动完成显示为表格
【发布时间】:2011-12-08 14:07:16
【问题描述】:

我正在使用 JQuery UI 的自动完成功能。我有许多值,以及一小部分关键字,其中一个分配给每个值。我想在一个迷你表格中显示每一对,其中一个单元格中的关键字和另一个单元格中的值。为此,我将覆盖_renderItem,如the documentation 中所述。但是,当我这样做时,单击一个值(或关键字)实际上并没有做任何事情,所以我无法选择任何值。我怀疑这与data("item.autocomplete", item) 不在正确的位置有关。或者,也许我需要覆盖更高的一些其他功能(_renderMenu_suggest?)

$( "#tags" ).autocomplete({
source: getItems
})
.data( "autocomplete" )._renderItem = function( ul, item ) {
return $( '<table></table>' )
    .data( "item.autocomplete", item )
    .append( '<tr><td>' + item.keyword + '</td><td> ' + item.value + "</td></tr>" )
    .appendTo( ul );
};

【问题讨论】:

  • 我不确定,但自动完成需要在 ul 中添加一个 li 元素?
  • 这是一个非常古老的问题,但我认为这个最近的问题的答案应该很有用:stackoverflow.com/q/10900401/422353

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


【解决方案1】:

我认为这可以帮助你,这里是js:

$(function() {
//overriding jquery-ui.autocomplete .js functions
$.ui.autocomplete.prototype._renderMenu = function(ul, items) {
  var self = this;
  //table definitions
  ul.append("<table><thead><tr><th>ID#</th><th>Name</th><th>Cool&nbsp;Points</th></tr></thead><tbody></tbody></table>");
  $.each( items, function( index, item ) {
    self._renderItemData(ul, ul.find("table tbody"), item );
  });
};
$.ui.autocomplete.prototype._renderItemData = function(ul,table, item) {
  return this._renderItem( table, item ).data( "ui-autocomplete-item", item );
};
$.ui.autocomplete.prototype._renderItem = function(table, item) {
  return $( "<tr class='ui-menu-item' role='presentation'></tr>" )
    .data( "item.autocomplete", item )
    .append( "<td >"+item.id+"</td>"+"<td>"+item.value+"</td>"+"<td>"+item.cp+"</td>" )
    .appendTo( table );
};
//random json values
var projects = [
    {id:1,value:"Thomas",cp:134},
    {id:65,value:"Richard",cp:1743},
    {id:235,value:"Harold",cp:7342},
    {id:78,value:"Santa Maria",cp:787},
    {id:75,value:"Gunner",cp:788},
    {id:124,value:"Shad",cp:124},
    {id:1233,value:"Aziz",cp:3544},
    {id:244,value:"Buet",cp:7847}
];
$( "#project" ).autocomplete({
    minLength: 1,
    source: projects,
    //you can write for select too
    focus: function( event, ui ) {
        //console.log(ui.item.value);
        $( "#project" ).val( ui.item.value );
        $( "#project-id" ).val( ui.item.id );
        $( "#project-description" ).html( ui.item.cp );
        return false;
    }
})
});

你可以看看这个fiddle

【讨论】:

  • 有效,但必须从 "&lt;tr class='ui-menu-item' role='presentation'&gt;&lt;/tr&gt;" 中删除类和角色才能正确显示表格。谢谢
  • 你最后不是在&lt;ul&gt; 里面加上&lt;table&gt; 吗?虽然你的小提琴看起来不错,但这可能不是最好的解决方案。
  • 同意,我只是想展示一个过程。当然还有其他方法可以做到这一点
  • @MominAlAziz 键盘导航?
【解决方案2】:

您不能在_renderItem 中创建&lt;table&gt; 来直接渲染项目。该插件使用&lt;ul&gt; 作为菜单项的容器。

您必须坚持使用&lt;li&gt; 元素,并且只能在&lt;li&gt; 中自定义标记,将您的表格元素插入其中。

但我个人不会使用桌子来做到这一点。你不能简单地使用 span 元素吗?

【讨论】:

    【解决方案3】:

    更新:一天后,我发现一个插件对我的项目环境好 10000 倍。 Select2,查看“加载远程数据”示例。

    原答案:

    我升级了之前的示例以使用当前的 jQuery 版本:

    JS Fiddle example with jQuery 2.1.4 and jQuery UI 1.11.4

    此外,我将此自动完成功能更改为用作自定义小部件,并包括对键盘导航的支持。

    代码:

    $.widget('custom.tableAutocomplete', $.ui.autocomplete, {
    options: {
        open: function (event, ui) {
            // Hack to prevent a 'menufocus' error when doing sequential searches using only the keyboard
            $('.ui-autocomplete .ui-menu-item:first').trigger('mouseover');
        },
        focus: function (event, ui) {
            event.preventDefault();
        }
    },
    _create: function () {
        this._super();
        // Using a table makes the autocomplete forget how to menu.
        // With this we can skip the header row and navigate again via keyboard.
        this.widget().menu("option", "items", ".ui-menu-item");
    },
    _renderMenu: function (ul, items) {
        var self = this;
        var $table = $('<table class="table-autocomplete">'),
            $thead = $('<thead>'),
            $headerRow = $('<tr>'),
            $tbody = $('<tbody>');
    
        $.each(self.options.columns, function (index, columnMapping) {
            $('<th>').text(columnMapping.title).appendTo($headerRow);
        });
    
        $thead.append($headerRow);
        $table.append($thead);
        $table.append($tbody);
    
        ul.html($table);
    
        $.each(items, function (index, item) {
            self._renderItemData(ul, ul.find("table tbody"), item);
        });
    },
    _renderItemData: function (ul, table, item) {
        return this._renderItem(table, item).data("ui-autocomplete-item", item);
    },
    _renderItem: function (table, item) {
        var self = this;
        var $tr = $('<tr class="ui-menu-item" role="presentation">');
    
        $.each(self.options.columns, function (index, columnMapping) {
            var cellContent = !item[columnMapping.field] ? '' : item[columnMapping.field];
            $('<td>').text(cellContent).appendTo($tr);
        });
    
        return $tr.appendTo(table);
    }
    });
    
    $(function () {
    var result_sample = [{
        "id": 26,
        "value": "Ladislau Santos Jr.",
        "email": "klber_moraes@email.net",
        "address": "9867 Robert St"
    }, {
        "id": 14,
        "value": "Pablo Santos",
        "email": "pablo@xpto.org",
        "address": "7540 Moreira Ponte"
    }, {
        "id": 13,
        "value": "Souza, Nogueira e Santos",
        "email": null,
        "address": "3504 Melo Marginal"
    }];
    
    $('input#search_field').tableAutocomplete({
        source: result_sample,
        columns: [{
            field: 'value',
            title: 'Name'
        }, {
            field: 'email',
            title: 'E-mail'
        }, {
            field: 'address',
            title: 'Address'
        }],
        delay: 500,
        select: function (event, ui) {
            if (ui.item != undefined) {
                $(this).val(ui.item.value);
                $('#selected_id').val(ui.item.id);
            }
            return false;
        }
    });
    });
    

    【讨论】:

    【解决方案4】:

    Fiddle 中给出了很好的例子。

    然而,在 jQuery 和 jQuery UI 的最新版本升级之后,它只是简单地停止了工作。不是绝对的,但是 jQuery UI 现在在 menufocus 上返回一个错误,这很烦人。

    JS Fiddle example with jQuery 2.1.3 and jQuery UI 1.11.3

    $(function() {
    //overriding jquery-ui.autocomplete .js functions
    $.ui.autocomplete.prototype._renderMenu = function(ul, items) {
      var self = this;
      //table definitions
      ul.append("<table><thead><tr><th>ID#</th><th>Name</th><th>Cool&nbsp;Points</th></tr></thead><tbody></tbody></table>");
      $.each( items, function( index, item ) {
        self._renderItemData(ul, ul.find("table tbody"), item );
      });
    };
    $.ui.autocomplete.prototype._renderItemData = function(ul,table, item) {
      return this._renderItem( table, item ).data( "ui-autocomplete-item", item );
    };
    $.ui.autocomplete.prototype._renderItem = function(table, item) {
      return $( "<tr class='ui-menu-item' role='presentation'></tr>" )
        //.data( "item.autocomplete", item )
        .append( "<td >"+item.id+"</td>"+"<td>"+item.value+"</td>"+"<td>"+item.cp+"</td>" )
        .appendTo( table );
    };
    //random json values
    var projects = [
    	{id:1,value:"Thomas",cp:134},
        {id:65,value:"Richard",cp:1743},
        {id:235,value:"Harold",cp:7342},
        {id:78,value:"Santa Maria",cp:787},
    	{id:75,value:"Gunner",cp:788},
    	{id:124,value:"Shad",cp:124},
    	{id:1233,value:"Aziz",cp:3544},
    	{id:244,value:"Buet",cp:7847}
    ];
    $( "#project" ).autocomplete({
    	minLength: 1,
    	source: projects,
        
    	focus: function( event, ui ) {
            if (ui.item != undefined)
            {
                console.log(ui.item.value);
                $( "#project" ).val( ui.item.value );
    		    $( "#project-id" ).val( ui.item.id );
    		    $( "#project-description" ).html( ui.item.cp );
            }
    		return false;
    	}//you can write for select too
        /*select:*/
    })
    });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2015-08-09
      • 2012-11-10
      相关资源
      最近更新 更多