จำกัด ผลลัพธ์ในการเติมข้อความอัตโนมัติ jQuery UI


126

ฉันใช้ jQuery UI การเติมข้อความอัตโนมัติ

 $("#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
ใช้งานได้เหมือนมีเสน่ห์ จะมีประโยชน์มากไหมถ้ารายการเติมข้อความอัตโนมัติของคุณยาวมาก (~ 10k ผลลัพธ์) และทำให้การแสดงผล html ช้า
Benjamin Crouzier

ขอบคุณมากสำหรับสิ่งนี้! ตอนนี้ฉันสามารถให้ผู้ใช้มีรายการจำนวนมากใน localStorage แต่เว็บไซต์รู้สึกเร็วมาก! น่ารัก! : D ขอบคุณมากสำหรับสิ่งนี้! : D มีความสุขมากที่ได้พบวิธีนี้ ^ __ ^
Alisso

จะเกิดอะไรขึ้นถ้าหนึ่งมีช่องเติมข้อความอัตโนมัติสองช่องในหน้าเดียวกัน เมื่อฉันทำการตอบสนองทั้งสองอย่างทั้งคู่ก็หยุดการแบ่งส่วนทั้งหมด: /
Alisso

+1 สำหรับโซลูชันนี้ ฉันจะเพิ่ม minLength: 3 เพื่อ จำกัด ผลลัพธ์ให้แคบลง jsfiddle.net/vqwBP/295
Adrian P.

2
ใน jsFiddle โซลูชันที่ให้ไว้ให้เปลี่ยนค่า slice จาก 10 เป็น 3 จากนั้นในช่องอินพุตป้อนอักขระ C คุณจะได้รับ 3 ค่าเท่านั้นซึ่งผู้ใช้ปลายทางสามารถทำให้พวกเขาเชื่อว่าเป็นค่าสามค่าที่มีอยู่ และไม่สามารถป้อนอักขระต่อไปได้ ทั้งหมดที่ฉันแนะนำคือให้ส่งข้อความช่วยเหลือที่ดีมาพร้อมกับโซลูชันนี้ (เช่นระบบจะแสดงเฉพาะผลลัพธ์ที่ตรงกัน XX อันดับแรกเท่านั้นพิมพ์ต่อไปเพื่อปรับแต่งผลลัพธ์ "มีบางอย่างตามบรรทัดเหล่านั้น
HPWD

45

คุณสามารถตั้งค่าminlengthตัวเลือกเป็นค่าใหญ่หรือคุณสามารถทำได้โดย css เช่นนี้

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

อัจฉริยภาพ ฉันชอบความเรียบง่ายของสิ่งนี้และช่วยให้ผู้ใช้ตัดสินใจได้
denislexic

18
นี่ค่อนข้างแฮ็ค หากคุณมีรายการที่ยาวมากและการเติมข้อความอัตโนมัติจะส่งกลับรายการที่ตรงกันหลายพันรายการจะทำให้เลือดไหลช้า ...
Vajk Hermecz

1
เห็นด้วยกับ Vajk นี่เป็นวิธีแก้ปัญหาที่ไม่ดีจากมุมมองที่ปรับขนาดได้
Kiksy

4
เห็นด้วยกับ Vajk อย่าเล่นกับ CSS เมื่อเกมอยู่ใน JS
Adrian P.

ฉันทำสิ่งเดียวกันนี้ในแอปพลิเคชันพจนานุกรมของฉัน คุ้ม!
Moxet ม.ค.

25

เช่นเดียวกับที่ "Jayantha" กล่าวว่าการใช้ css จะเป็นวิธีที่ง่ายที่สุด แต่อาจจะดีกว่า

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

ข้อแตกต่างเพียงอย่างเดียวคือ "max-height" วิธีนี้จะช่วยให้วิดเจ็ตสามารถปรับขนาดให้มีความสูงน้อยลง แต่ไม่เกิน 200px


4
เพราะการแก้ปัญหาของคุณ. แม้ว่าจะเป็นสิ่งที่ถูกต้องเรากำลังพูดถึงโซลูชั่น jQuery การเสนอโซลูชัน CSS ให้กับโปรแกรมเมอร์ไม่ใช่ความคิดที่ดีเมื่อสามารถแก้ไขปัญหาด้วย jQuery ได้ และในตอนท้ายนี่เป็นเพียงการปิดบังผลลัพธ์ที่ไม่สามารถแก้ปัญหาได้เหมือนในคำตอบที่ยอมรับ จัดไป!
Adrian P.

3
@SamBattat การใช้ css สำหรับปัญหาการเขียนโปรแกรมเป็นการแฮ็คที่น่ากลัว ลองนึกภาพว่าพยายามแก้จุดบกพร่อง!
Christian Payne

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

นี่คือสิ่งที่ฉันกำลังมองหา! ไม่ จำกัด จำนวนผลลัพธ์ แต่จำนวนรายการ shwn! thx
Serge insas

ทำไมคำตอบนี้จึงมีการโหวตเพิ่มน้อยมาก? มีสิ่งผิดปกติเกิดขึ้นหรือไม่? ทำงานให้ฉันอย่างน้อยก็ตั้งแต่แรกเห็น
Szybki

3

หากผลลัพธ์มาจากแบบสอบถาม mysql การ จำกัด ผลลัพธ์ mysql โดยตรงจะมีประสิทธิภาพมากกว่า:

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

โดยที่ 10 คือจำนวนแถวสูงสุดที่คุณต้องการ


1
ไม่ดีที่จะค้นหา DB ทุกเมาส์! อาจทำงานช้าในบางเซิร์ฟเวอร์หรือฐานข้อมูลขนาดใหญ่ ยังไงก็ตามฉันไม่ได้ลงคะแนน แต่เขียนคำอธิบายนี้ สิ่งที่ผู้คนควรทำเมื่อลงคะแนน ขอบคุณ
Adrian P.

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

ไม่มีพารามิเตอร์สูงสุด

http://docs.jquery.com/UI/Autocomplete


1
ฉันเห็นพารามิเตอร์สูงสุดจากลิงค์นี้docs.jquery.com/UI/Autocomplete/autocompleteใต้เมนูตัวเลือก
santhosh

2
ฉันไม่เห็นพารามิเตอร์ "สูงสุด" ในลิงก์ของคุณ
Adrian P.

0

ในกรณีของฉันมันใช้งานได้ดี:

source:function(request, response){
    var numSumResult = 0;
    response(
        $.map(tblData, function(rowData) {
            if (numSumResult < 10) {
                numSumResult ++;
                return {
                    label:          rowData.label,
                    value:          rowData.value,
                }
            }
        })
    );
},
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.