Ограничить результат в jQuery автозаполнения

Как вы можете установить ограничение на результат автозаполнения jQuery?

Это мой код:

        $.ajax({
            url: "/cache/search/SearchModels.xml",
            dataType: "xml",
            success: function(xmlResponse) {
                var data = $("SearchModel", xmlResponse).map(function() {
                    return {
                        value: $("Name", this).text() + ", " + $("Description", this).text(),
                        id: $("No", this).text(),
                        name: $("Name", this).text(),
                        url: $("URL", this).text()
                    };
                }).get();
                $("#txtTopSearch").autocomplete({
                    source: data,
                    minLength: 2,
                    select: function(event, ui) {
                        BlockUI();
                        if (typeof (ui.item.url) != 'undefined') {
                            window.location = ui.item.url;
                        }
                        else {
                            alert('Page not found!');
                            $.unblockUI();
                        }
                    },
                    search: function(event, ui) {
                        $('#txtTopSearch').addClass('searchInProgress');
                    },
                    close: function(event, ui) {
                        $('#txtTopSearch').removeClass('searchInProgress');
                    }
                }).data("autocomplete")._renderItem = function(ul, item) {
                    return $("<li></li>")
                    .data("item.autocomplete", item)
                    .append("<a><span style='font-size:.9em; font-weight:bold;'>" + item.id + "</span><br /><span style='font-size:.8em;'>" + item.name + "</span></a>")
                    .appendTo(ul);
                };
            },
            error: function(xhr, textStatus, errorThrown) {
                alert('Error: ' + xhr.statusText);
            }
        });

этот код возвращает все результаты в запросе, но я хочу ограничить это только показом 10 результатов. В старой версии автозаполнения был вариант для этого, но теперь он устарел.

пример XML:

<?xml version="1.0"?>
<ArrayOfSearchModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SearchModel>
    <No>1</No>
    <Name>My product</Name>
    <Description>My description</Description>
    <Tags>blue;brown;</Tags>
    <URL>/Products/1</URL>
  </SearchModel>
</ArrayOfSearchModel>

5 ответов


Последнее Обновление
после понимания того, что в моих предыдущих ответах я ограничивал весь набор результатов xml, а не результаты автозаполнения

как переопределить значение по умолчанию _renderItem метод, вы можете переопределить значение по умолчанию _renderMenu.

$.ui.autocomplete.prototype._renderMenu = function( ul, items ) {
   var self = this;
   $.each( items, function( index, item ) {
      if (index < 10) // here we define how many results to show
         {self._renderItem( ul, item );}
      });
}

ответ изменен из этого jQueryUI: как я могу настроить форматирование результатов автозаполнения плагина? так что спасибо @cheeso..


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

вы success использование обратного вызова $("SearchModel:lt(10)", xmlResponse).map(...

на :lt(10) получает элементы с индексом менее 10. Так максимальные 10 результатов будут возвращены..

(конечно, число 10 может быть все, что угодно)

посмотреть :lt() селектор в http://api.jquery.com/lt-selector/

обновление

хотя я не могу понять, почему первый ответ не работает, поскольку SearchModel - это тег и мы нацелены на это.. мы можем переместить фильтрацию в метод map..

success: function(xmlResponse) {
                var data = $("SearchModel", xmlResponse).map(function(index) {
                    if (index<10)
                      {
                        return {
                            value: $("Name", this).text() + ", " + $("Description", this).text(),
                            id: $("No", this).text(),
                            name: $("Name", this).text(),
                            url: $("URL", this).text()
                               };
                      }
                      else
                      { return null; }
                }).get();

документация по map ()


Почему бы не ограничить данные, возвращаемые запросом из источника xml?

Edit:

вы должны помнить, что функция автозаполнения по существу использует регулярное выражение для сопоставления элементов в источнике данных. Наличие большого источника данных плохо, потому что он должен анализировать так много данных, чтобы просто найти правильный элемент.


Это то, что я сделал на основе некоторого чтения документов API автозаполнения

$input.autocomplete({
  source: function( request, response ) {
    $.getJSON('search.php', request, function( data, status, xhr ) {
      // return a max of 10 results.
      response( data.slice(0, 9) );
    });
  }
})

следуя этому шаблону, вам не придется делать какие-либо фанки в слое рендеринга.


самый быстрый способ ограничить результаты-это сделать это во время события" open". Мы можем удалить часть содержимого, динамически созданного jQuery ui, уменьшая массив дочерних элементов.

это решение решило ту же проблему для меня:

var maxResults = 10;
$input.autocomplete({
    source: somefile.json,
    open: function(event,ui){
          $(this).data("uiAutocomplete").menu.element.children().slice(maxResults).remove();
         }
})

вы можете добавить обработчик для события "open":

    open:function(event,ui){ 
    var maxListLength=10;
    var ul = jQuery( "#txtTopSearch" ).autocomplete("widget")[0];
    while(ul.childNodes.length > maxListLength)
          ul.removeChild(ul.childNodes[ul.childNodes.length-1]);
    }