Ограничить результат в 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();
Почему бы не ограничить данные, возвращаемые запросом из источника 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]);
}