Batasi hasil di jQuery UI Autocomplete

126

Saya menggunakan jQuery UI Autocomplete.

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

Parameter maks tidak berfungsi dan saya masih mendapatkan lebih dari 10 hasil. Apakah saya melewatkan sesuatu?

santhosh
sumber
11
Tidak ada opsi yang disebut maxdalam pelengkapan otomatis
Jayantha Lal Sirisena

Jawaban:

272

Ini dokumentasi yang tepat untuk widget jQueryUI . Tidak ada parameter bawaan untuk membatasi hasil maksimal, tetapi Anda dapat mencapainya dengan mudah:

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

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

Anda dapat menyediakan fungsi ke sourceparameter dan kemudian memanggil slicearray yang difilter.

Berikut ini contoh yang berhasil: http://jsfiddle.net/andrewwhitaker/vqwBP/

Andrew Whitaker
sumber
7
Bekerja seperti pesona. Apakah ini sangat berguna jika daftar pelengkapan otomatis Anda sangat panjang (~ hasil 10k) dan memperlambat rendering html.
Benjamin Crouzier
Terima kasih banyak atas ini! Sekarang saya dapat membiarkan pengguna memiliki daftar besar di localStorage, tetapi situs web terasa sangat cepat! Menyenangkan! : D terima kasih banyak untuk ini! : D sangat senang saya senang menemukan solusi ini ^ __ ^
Alisso
bagaimana jika seseorang memiliki dua kotak autocomplete pada halaman yang sama? Ketika saya melakukan irisan respons pada keduanya, keduanya berhenti mengiris sama sekali: /
Alisso
+1 untuk solusi ini. Saya akan menambahkan minLength: 3 untuk mempersempit lebih banyak hasil. jsfiddle.net/vqwBP/295
Adrian P.
2
Di jsFiddle solusi yang disediakan, ubah nilai slice dari 10 menjadi 3 dan kemudian di kotak input, masukkan karakter C. Anda hanya akan menerima 3 nilai yang oleh pengguna akhir bisa membuat mereka percaya bahwa hanya tiga nilai yang tersedia dan mungkin tidak melanjutkan memasukkan karakter. Semua saya menyarankan adalah untuk memberikan baik teks bantuan untuk menemani solusi ini (misalnya hasil Hanya bagian atas XX cocok akan ditampilkan Lanjutkan mengetik untuk memperbaiki hasil "Sesuatu sepanjang garis itu...
HPWD
45

Anda dapat mengatur minlengthopsi ke beberapa nilai besar atau Anda dapat melakukannya dengan css seperti ini,

.ui-autocomplete { height: 200px; overflow-y: scroll; overflow-x: hidden;}
Jayantha Lal Sirisena
sumber
Jenius. Saya suka kesederhanaan ini dan itu memungkinkan pengguna memutuskan.
denislexic
18
Ini cukup aneh. Jika Anda memiliki daftar yang sangat panjang, dan pelengkapan otomatis mengembalikan ribuan pertandingan, itu akan sangat lambat ...
Vajk Hermecz
1
Setuju dengan Vajk. Ini adalah solusi yang buruk dari sudut pandang skalabilitas.
Kiksy
4
Setuju dengan Vajk. Jangan bermain dengan CSS saat game di JS.
Adrian P.
Saya melakukan hal yang sama di aplikasi kamus saya. Itu layak!
Moxet
25

Sama seperti "Jayantha" mengatakan menggunakan css akan menjadi pendekatan yang paling mudah, tetapi ini mungkin lebih baik,

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

Perhatikan satu-satunya perbedaan adalah "max-height". ini akan memungkinkan widget untuk mengubah ukuran ke ketinggian yang lebih kecil tetapi tidak lebih dari 200px

Sam Battat
sumber
4
Karena solusi Anda. Meskipun ini valid, kami sedang mendiskusikan solusi jQuery. Menawarkan solusi CSS ke programmer bukanlah ide yang baik ketika masalah dapat diselesaikan ke jQuery. Dan pada akhirnya ini hanya menutupi hasil tidak memecahkan masalah seperti pada jawaban yang diterima. Ini dia!
Adrian P.
3
@SamBattat Menggunakan css untuk masalah pemrograman adalah hack yang mengerikan. Bayangkan mencoba men-debug itu!
Christian Payne
19

Menambah jawaban Andrew , Anda bahkan dapat memperkenalkan sebuah maxResultsproperti dan menggunakannya dengan cara ini:

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

Ini akan membantu pembacaan dan pemeliharaan kode!

Merobek
sumber
10

inilah yang saya gunakan

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

Overflow otomatis sehingga bilah gulir tidak akan ditampilkan saat tidak seharusnya.

Desto
sumber
5

Saya bisa mengatasi masalah ini dengan menambahkan konten berikut ke file CSS saya:

.ui-autocomplete {
    max-height: 200px;
    overflow-y: auto;
    overflow-x: hidden;
}
Sam
sumber
Tolong jangan tambahkan "terima kasih" sebagai jawaban. Mereka sebenarnya tidak memberikan jawaban atas pertanyaan, dan dapat dianggap sebagai kebisingan oleh pengunjung masa depannya. Alih-alih, pilihlah jawaban yang Anda sukai. Dengan cara ini, pengunjung pertanyaan di masa mendatang akan melihat jumlah suara yang lebih tinggi pada jawaban itu, dan penjawab juga akan dihargai dengan poin reputasi. Lihat Mengapa memilih itu penting .
jps
ini benar-benar apa yang saya cari! tidak membatasi jumlah hasil tetapi jumlah item udang! thx
Serge insas
Mengapa jawaban ini memiliki sedikit upvotes? Apakah ada yang salah dengan itu? Bekerja untuk saya, setidaknya pada pandangan pertama.
Szybki
3

Jika hasil berasal dari permintaan mysql, lebih efisien untuk membatasi langsung hasil mysql:

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

di mana 10 adalah jumlah maksimum baris yang Anda inginkan

the_nutria
sumber
1
Tidak baik untuk meminta DB setiap mouse! Bisa lambat di beberapa server atau DB besar. Omong-omong, saya tidak memilih tetapi menulis penjelasan ini. Apa yang harus dilakukan orang ketika mereka memilih. Terima kasih.
Adrian P.
2

Saya melakukannya dengan cara sebagai berikut:

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
}
}
));
AH Jamali
sumber
2

jQuery memungkinkan Anda untuk mengubah pengaturan default saat Anda melampirkan pelengkapan otomatis ke input:

$('#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
   }
});
myjeeed
sumber
2

Plugin: jquery-ui-autocomplete-scroll dengan scroller dan membatasi hasil yang indah

$('#task').autocomplete({
  maxShowItems: 5,
  source: myarray
});
KingRider
sumber
2

Saya sudah mencoba semua solusi di atas, tetapi milik saya hanya bekerja dengan cara ini:

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

Dalam kasus saya ini berfungsi dengan baik:

source:function(request, response){
    var numSumResult = 0;
    response(
        $.map(tblData, function(rowData) {
            if (numSumResult < 10) {
                numSumResult ++;
                return {
                    label:          rowData.label,
                    value:          rowData.value,
                }
            }
        })
    );
},
tlberio
sumber