Обмежте результати в автоматичному завершенні інтерфейсу 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.