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?


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/


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;}

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


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!


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.


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;
}

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


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
}
}
));

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
   }
});


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
    };
    }));
},


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,
                }
            }
        })
    );
},
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.