JQuery UI Autocomplete'de sonuçları sınırlama


Yanıtlar:


272

Burada jQueryUI pencere aracı için uygun belgeler bulunmaktadır . Maksimum sonuçları sınırlamak için yerleşik bir parametre yoktur, ancak bunu kolayca başarabilirsiniz:

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

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

sourceParametreye bir işlev sağlayabilir ve ardından slicefiltrelenmiş diziyi çağırabilirsiniz .

İşte çalışan bir örnek: http://jsfiddle.net/andrewwhitaker/vqwBP/


7
Tıkır tıkır çalışıyor. Otomatik tamamlama listeniz çok uzunsa (~ 10k sonuç) ve html oluşturmayı yavaşlatıyorsa çok yararlı mıdır?
Benjamin Crouzier

Bunun için çok teşekkür ederim! Artık kullanıcıların localStorage'da büyük bir listeye sahip olmasına izin verebilirim, ancak web sitesi gerçekten hızlı hissediyor! Güzel! : D bunun için çok teşekkür ederim! : D Bu çözümü bulduğuma çok sevindim ^ __ ^
Alisso

ya aynı sayfada iki otomatik tamamlama kutusu varsa? Her ikisinde de yanıt dilimini yaptığımda, her ikisi de dilimlemeyi
bırakıyor

Bu çözüm için +1. Sonuçları daha fazla daraltmak için minLength: 3 ekleyeceğim. jsfiddle.net/vqwBP/295
Adrian P.

2
Sağlanan çözüm jsFiddle'da, dilim değerini 10'dan 3'e değiştirin ve ardından giriş kutusuna C karakterini girin, yalnızca bir son kullanıcının mevcut üç değer olduğuna inanmasına neden olabilecek 3 değer alacaksınız. ve karakter girmeye devam etmeyebilir. Tek önerdiğim, bu çözüme eşlik edecek iyi bir yardım metni sağlamaktır (ör. Yalnızca en iyi XX eşleşen sonuçlar görüntülenecektir. Sonuçları hassaslaştırmak için yazmaya devam edin. "Bu satırlar boyunca bir şey.
HPWD

45

minlengthSeçeneği büyük bir değere ayarlayabilir veya bunun gibi css ile yapabilirsiniz,

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

Cin. Bunun basitliğini seviyorum ve kullanıcının karar vermesini sağlıyor.
denislexic

18
Bu oldukça zordur. Gerçekten uzun bir listeniz varsa ve otomatik tamamlama binlerce maç döndürürse, çok yavaş olacak ...
Vajk Hermecz

1
Vajk ile aynı fikirde. Bu, ölçeklenebilirlik açısından kötü bir çözümdür.
Kiksy

4
Vajk ile aynı fikirde. Oyun JS'de iken CSS ile oynamayın.
Adrian P.

Sözlük uygulamamda da aynısını yaptım. Buna layık!
Moxet

25

Aynı "Jayantha" nın css kullanmanın en kolay yaklaşım olduğunu söylediği gibi, ancak bu daha iyi olabilir,

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

Tek farkın "maksimum yükseklik" olduğunu unutmayın. bu, widget'ın daha küçük bir yüksekliğe yeniden boyutlandırılmasına izin verir ancak 200 pikselden fazla olmamasını sağlar


4
Çözümünüz yüzünden. Geçerli bile olsa jQuery çözümlerini tartışıyoruz. Bir programcıya bir CSS çözümü sunmak, problem jQuery'de çözülebildiğinde iyi bir fikir değildir. Ve sonunda bu, kabul edilen cevapta olduğu gibi problemi çözmeyen sonuçları maskelemek. Hadi bakalım!
Adrian P.

3
@SamBattat Bir programlama problemi için css kullanmak korkunç bir hack. Bunda hata ayıklamaya çalıştığınızı hayal edin!
Christian Payne

19

Ekleme Andrew cevap , hatta olabilir tanıtmak bir maxResultsmülk ve bu şekilde kullanın:

$("#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/

Bu, kod okunabilirliğine ve sürdürülebilirliğine yardımcı olmalıdır!


10

işte kullandım

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

Taşma otomatiktir, böylece kaydırma çubuğu olması gerektiği zaman görünmez.


5

CSS dosyama aşağıdaki içeriği ekleyerek bu sorunu çözebilirim:

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

Lütfen yanıt olarak "teşekkürler" ifadesini eklemeyin. Aslında soruya bir cevap vermezler ve gelecekteki ziyaretçileri tarafından gürültü olarak algılanabilirler. Bunun yerine, beğendiğiniz yanıtlara olumlu oy verin . Bu şekilde, sorunun gelecekteki ziyaretçileri bu yanıt için daha yüksek bir oy sayımı görecek ve cevaplayan kişi de itibar puanları ile ödüllendirilecektir. Oy vermek neden önemlidir konusuna bakın .
jps

tam olarak aradığım şey buydu! sonuçların sayısını değil, gölgeli öğelerin sayısını sınırlıyor! thx
Serge insas

Bu yanıtın neden bu kadar az olumlu oyu var? onla ilgili yanlış bir şey mi var? En azından ilk bakışta benim için çalıştı.
Szybki

3

Sonuçlar bir mysql sorgusundan geliyorsa, doğrudan mysql sonucunu sınırlamak daha etkilidir:

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

10 istediğiniz maksimum satır sayısıdır


1
Her farede bir DB'yi sorgulamak iyi değil! Bazı sunucularda veya devasa DB'de yavaş olabilir. Bu arada, oy vermedim ama bu açıklamayı yazdım. İnsanlar olumsuz oy kullandıklarında ne yapmalılar. Teşekkürler.
Adrian P.

2

Bunu şu şekilde yaptım:

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, bir girişe otomatik tamamlamayı eklediğinizde varsayılan ayarları değiştirmenize olanak tanır:

$('#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

Yukarıdaki tüm çözümleri denedim, ancak benimki yalnızca şu şekilde çalıştı:

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


0

Benim durumumda bu iyi çalışıyor:

source:function(request, response){
    var numSumResult = 0;
    response(
        $.map(tblData, function(rowData) {
            if (numSumResult < 10) {
                numSumResult ++;
                return {
                    label:          rowData.label,
                    value:          rowData.value,
                }
            }
        })
    );
},
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.