Отображение автозаполнения JQuery UI в виде таблицы - PullRequest
6 голосов
/ 08 декабря 2011

Я использую автозаполнение JQuery UI. У меня есть несколько значений, а также небольшая коллекция ключевых слов, одно из которых присваивается каждому значению. Я хотел бы отобразить каждую пару в мини-таблице с ключевым словом в одной ячейке и значением в другой. Для этого я перезаписываю _renderItem, как указано в документации . Однако, когда я делаю это, нажатие на значение (или ключевое слово) фактически ничего не делает, поэтому я не могу выбрать какие-либо значения. Я подозреваю, что это как-то связано с тем, что 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 );
};

Ответы [ 4 ]

7 голосов
/ 28 апреля 2014

Я думаю, что это может помочь вам, вот 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;
    }
})
});

Вы можете проверить это скрипка

2 голосов
/ 08 декабря 2011

Вы не можете создать <table> в _renderItem для прямой визуализации элемента. Плагин использует <ul> в качестве контейнера для пунктов меню.

Вы должны придерживаться элементов <li> и можете настраивать только разметку внутри <li>, вставляя в нее элемент таблицы.

Но я бы лично не использовал таблицу для этого. Разве вы не можете просто использовать элементы span?

0 голосов
/ 06 мая 2015

Обновление: один день после того, как я нашел плагин в 10000 раз лучше для моего проекта. Выберите 2 , проверьте пример «загрузки удаленных данных».

Оригинальный ответ:

Я обновил предыдущие образцы, чтобы использовать текущие версии jQuery:

Пример JS Fiddle с jQuery 2.1.4 и 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;
    }
});
});
0 голосов
/ 25 марта 2015

Хороший пример, приведенный в скрипке.

Однако после последних версий обновление jQuery и jQuery UI просто перестало работать.Не совсем, однако пользовательский интерфейс jQuery теперь возвращает ошибку в menufocus, что довольно раздражает.

Пример JS Fiddle с jQuery 2.1.3 и 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:*/
})
});
...