Обмежте результати в автоматичному завершенні інтерфейсу jQuery


126

Я використовую jQuery UI Autocomplete.

 $("#task").autocomplete({
     max:10,
     minLength:3,
     source: myarray
 });          

Параметр max не працює, і я все одно отримую більше 10 результатів. Я щось пропускаю?


11
Не існує жодної опції maxдля автозаповнення
Jayantha Lal Sirisena

Відповіді:


272

Ось відповідна документація для віджета jQueryUI . Немає вбудованого параметра для обмеження максимальних результатів, але це можна легко виконати:

$("#auto").autocomplete({
    source: function(request, response) {
        var results = $.ui.autocomplete.filter(myarray, request.term);

        response(results.slice(0, 10));
    }
});

Ви можете надати функцію sourceпараметру, а потім викликати sliceвідфільтрований масив.

Ось робочий приклад: http://jsfiddle.net/andrewwhitaker/vqwBP/


7
Працює як шарм. Це дуже корисно, якщо ваш список автозаповнення дуже довгий (~ 10 к. Результатів) і сповільнює html-рендерінг.
Бенджамін Крозьє

Дуже дякую за це! Тепер я можу дозволити користувачам мати величезний список у localStorage, але веб-сайт відчуває себе дуже швидко! Прекрасна! : D дякую тобі за це! : D так щаслива, що я сподіваюся знайти це рішення ^ __ ^
Аліссо

що робити, якщо на одній сторінці є два поля для автозаповнення? Коли я роблю фрагмент відповіді на обох, обидва припиняють
обрізання

+1 для цього рішення. Я додам minLength: 3, щоб звузити більше результатів. jsfiddle.net/vqwBP/295
Адріан П.

2
У наданому рішенні jsFiddle змініть значення зрізу з 10 на 3, а потім у поле введення введіть символ C. Ви отримаєте лише 3 значення, які для кінцевого користувача можуть привести їх до думки, що це єдині три доступні значення і може не продовжувати вводити символи. Все, що я пропоную, - це надати хороший текст довідки, який буде супроводжувати це рішення (наприклад, відображатимуться лише відповідні результати у верхньому XX. Продовжуйте вводити текст для уточнення результатів. "Щось за цими напрямками"
HPWD

45

Ви можете встановити minlengthпараметр на якесь велике значення або зробити це за допомогою css, як це,

.ui-autocomplete { height: 200px; overflow-y: scroll; overflow-x: hidden;}

Геніальність. Мені подобається простота цього, і це дозволяє користувачеві приймати рішення.
деніслексик

18
Це досить хакі. Якщо у вас справді довгий список, а автозаповнення повертає тисячі матчів, це буде криваво повільним ...
Вайк Гермеч

1
Погодьтеся з Вайком. Це невдале рішення з точки зору масштабованості.
Кікссі

4
Погодьтеся з Вайком. Не грайте з CSS, коли гра в JS.
Адріан П.

Я робив те саме в моїй програмі словника. Це гідно!
Moxet

25

Так само, як "Jayantha" сказав, що використання css було б найпростішим підходом, але це може бути краще,

.ui-autocomplete { max-height: 200px; overflow-y: scroll; overflow-x: hidden;}

Зауважте, єдина відмінність - "максимальна висота". це дозволить віджету змінити розмір на меншу висоту, але не більше 200 пікселів


4
Через ваше рішення. Навіть він є дійсним, ми обговорюємо рішення jQuery. Запропонувати програмісту рішення CSS - це не дуже гарна ідея, коли проблему можна вирішити jQuery. І наприкінці це просто маскування результатів, не вирішення проблеми, як у прийнятій відповіді. Ось ви йдете!
Адріан П.

3
@SamBattat Використання css для проблеми програмування - жахливий хак. Уявіть, що намагаєтеся налагодити це!
Крістіан Пейн

19

Додавання до відповіді Ендрю , ви можете навіть ввести в maxResultsвласність і використовувати його таким чином:

$("#auto").autocomplete({ 
    maxResults: 10,
    source: function(request, response) {
        var results = $.ui.autocomplete.filter(src, request.term);
        response(results.slice(0, this.options.maxResults));
    }
});

jsFiddle: http://jsfiddle.net/vqwBP/877/

Це повинно допомогти читати код та ремонтувати!


10

ось що я використав

.ui-autocomplete { max-height: 200px; overflow-y: auto; overflow-x: hidden;}

Автоматичне переповнення, тому смуга прокрутки не відображатиметься, коли цього не потрібно.


5

Я можу вирішити цю проблему, додавши наступний вміст до мого CSS-файлу:

.ui-autocomplete {
    max-height: 200px;
    overflow-y: auto;
    overflow-x: hidden;
}

Будь ласка, не додайте "дякую" як відповіді. Вони насправді не дають відповіді на питання, і їх майбутні відвідувачі можуть сприймати як шум. Натомість виправдайте відповіді, які вам подобаються. Таким чином майбутні відвідувачі питання побачать більший підрахунок голосів за цю відповідь, а відповідь також буде нагороджений балами репутації. Дивіться, чому важливо голосування .
jps

це чітко те, що я шукав! не обмежуючи кількість результатів, а кількість показаних елементів! thx
Серж інсас

Чому ця відповідь має так мало відгуків? Чи з цим щось не так? Працював для мене, принаймні з першого погляду.
Szybki

3

Якщо результати надходять із запиту mysql, то ефективніше обмежити результат mysql безпосередньо:

select [...] from [...] order by [...] limit 0,10

де 10 - максимальне число рядків, яке ви хочете


1
Не добре запитувати БД кожну мишу! Може бути повільним на деяких серверах або величезною БД. До речі, я не проголосував, але написав це пояснення. Що робити людям, коли вони проголосують. Дякую.
Адріан П.

2

Я зробив це наступним чином:

success: function (result) {
response($.map(result.d.slice(0,10), function (item) {
return {
// Mapping to Required columns (Employee Name and Employee No)
label: item.EmployeeName,
value: item.EmployeeNo
}
}
));

2

jQuery дозволяє змінити параметри за замовчуванням, коли ви додаєте автозаповнення до входу:

$('#autocomplete-form').autocomplete({
   maxHeight: 200, //you could easily change this maxHeight value
   lookup: array, //the array that has all of the autocomplete items
   onSelect: function(clicked_item){
      //whatever that has to be done when clicked on the item
   }
});


2

Я спробував усі рішення вище, але мій працював лише таким чином:

success: function (data) {
    response($.map(data.slice (0,10), function(item) {
    return {
    value: item.nome
    };
    }));
},


0

У моєму випадку це працює чудово:

source:function(request, response){
    var numSumResult = 0;
    response(
        $.map(tblData, function(rowData) {
            if (numSumResult < 10) {
                numSumResult ++;
                return {
                    label:          rowData.label,
                    value:          rowData.value,
                }
            }
        })
    );
},
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.