Giới hạn kết quả trong Tự động hoàn thành giao diện người dùng jQuery


126

Tôi đang sử dụng jQuery UI Autocomplete.

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

Tham số tối đa không hoạt động và tôi vẫn nhận được hơn 10 kết quả. Tui bỏ lỡ điều gì vậy?


11
Không có tùy chọn nào được gọi là maxtự động hoàn tất
Jayantha Lal Sirisena

Câu trả lời:


272

Đây là tài liệu thích hợp cho widget jQueryUI . Không có tham số tích hợp để giới hạn kết quả tối đa, nhưng bạn có thể thực hiện dễ dàng:

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

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

Bạn có thể cung cấp một hàm cho sourcetham số và sau đó gọi slicevào mảng đã lọc.

Đây là một ví dụ hoạt động: http://jsfiddle.net/andrewwhitaker/vqwBP/


7
Hoạt động như một lá bùa. Có phải nó rất hữu ích nếu danh sách tự động hoàn thành của bạn rất dài (~ 10k kết quả) và làm chậm kết xuất html.
Benjamin Crouzier

Cảm ơn bạn rất nhiều vì điều này! Bây giờ tôi có thể cho phép người dùng có một danh sách lớn trong localStorage, nhưng trang web cảm thấy rất nhanh! Đáng yêu! : D cảm ơn bạn rất nhiều vì điều này! : D rất vui, tôi rất vui khi tìm thấy giải pháp này ^ __ ^
Alisso

Điều gì nếu một có hai hộp tự động hoàn thành trên cùng một trang? Khi tôi thực hiện lát cắt phản hồi trên cả hai, cả hai đều dừng cắt lát: /
Alisso

+1 cho giải pháp này. Tôi sẽ thêm minLạng: 3 để thu hẹp thêm kết quả. jsfiddle.net/vqwBP/295
Adrian P.

2
Trong jsFiddle giải pháp được cung cấp, thay đổi giá trị lát từ 10 thành 3 và sau đó trong hộp nhập, nhập ký tự C. bạn sẽ chỉ nhận được 3 giá trị mà người dùng cuối có thể khiến họ tin rằng đó là ba giá trị duy nhất khả dụng và có thể không tiếp tục nhập ký tự. Tất cả những gì tôi đề nghị là cung cấp văn bản trợ giúp tốt để đi kèm với giải pháp này (ví dụ: Chỉ kết quả trùng khớp XX hàng đầu mới được hiển thị. Tiếp tục nhập để tinh chỉnh kết quả. "Một cái gì đó dọc theo những dòng đó.
HPWD 13/12/13

45

Bạn có thể đặt minlengthtùy chọn thành một số giá trị lớn hoặc bạn có thể làm điều đó bằng cách css như thế này,

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

Thiên tài. Tôi yêu sự đơn giản của điều này và nó cho phép người dùng quyết định.
denislexic

18
Điều này là khá hack. Nếu bạn có một danh sách thực sự dài và tự động hoàn thành trả về hàng ngàn trận đấu, nó sẽ bị chậm máu ...
Vajk Hermecz

1
Đồng ý với Vajk. Đây là một giải pháp kém từ quan điểm khả năng mở rộng.
Kiksy

4
Đồng ý với Vajk. Không chơi với CSS khi trò chơi ở dạng JS.
Adrian P.

Tôi đã làm điều tương tự trong ứng dụng từ điển của tôi. Nó xứng đáng!
Moxet

25

Giống như "Jayantha" cho biết sử dụng css sẽ là cách tiếp cận dễ dàng nhất, nhưng điều này có thể tốt hơn,

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

Lưu ý sự khác biệt duy nhất là "chiều cao tối đa". điều này sẽ cho phép các widget thay đổi kích thước thành chiều cao nhỏ hơn nhưng không quá 200px


4
Vì giải pháp của bạn. Thậm chí nó là một thứ hợp lệ mà chúng ta đang thảo luận về các giải pháp jQuery. Cung cấp giải pháp CSS cho lập trình viên không phải là ý kiến ​​hay khi vấn đề có thể được giải quyết với jQuery. Và cuối cùng, đây chỉ là mặt nạ cho kết quả không giải quyết được vấn đề như trong câu trả lời được chấp nhận. Bạn đi đây!
Adrian P.

3
@SamBattat Sử dụng css cho một vấn đề lập trình là một hack khủng khiếp. Hãy tưởng tượng cố gắng để gỡ lỗi đó!
Christian Payne

19

Thêm vào câu trả lời của Andrew , bạn thậm chí có thể giới thiệu một maxResultstài sản và sử dụng nó theo cách này:

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

Điều này sẽ giúp mã dễ đọc và bảo trì!


10

đây là những gì tôi đã sử dụng

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

Tự động tràn để thanh cuộn sẽ không hiển thị khi không được phép.


5

Tôi có thể giải quyết vấn đề này bằng cách thêm nội dung sau vào tệp CSS của mình:

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

Vui lòng không thêm "cảm ơn" làm câu trả lời. Họ không thực sự cung cấp câu trả lời cho câu hỏi và có thể được coi là tiếng ồn bởi khách truy cập trong tương lai. Thay vào đó, upvote câu trả lời bạn thích. Bằng cách này, khách truy cập tương lai của câu hỏi sẽ thấy số phiếu cao hơn cho câu trả lời đó và người trả lời cũng sẽ được thưởng điểm danh tiếng. Xem tại sao bỏ phiếu quan trọng .
jps

đây là chính xác những gì tôi đang tìm kiếm! không giới hạn số lượng kết quả nhưng số lượng các mục shwn! thx
Serge insas

Tại sao câu trả lời này có rất ít upvote? Có điểm nào sai không? Làm việc cho tôi, ít nhất là từ cái nhìn đầu tiên.
Szybki

3

Nếu kết quả đến từ truy vấn mysql, sẽ hiệu quả hơn khi giới hạn trực tiếp kết quả mysql:

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

Trong đó 10 là số lượng hàng tối đa bạn muốn


1
Không tốt để truy vấn DB mỗi con chuột lên! Có thể chậm trên một số máy chủ hoặc DB lớn. Nhân tiện, tôi đã không bỏ phiếu mà viết lời giải thích này. Mọi người nên làm gì khi họ bỏ phiếu xuống. Cảm ơn.
Adrian P.

2

Tôi đã làm nó theo cách sau:

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 cho phép bạn thay đổi các cài đặt mặc định khi bạn đính kèm tự động hoàn thành vào đầu vào:

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

Tôi đã thử tất cả các giải pháp trên, nhưng tôi chỉ làm việc theo cách này:

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


0

Trong trường hợp của tôi, điều này hoạt động tốt:

source:function(request, response){
    var numSumResult = 0;
    response(
        $.map(tblData, function(rowData) {
            if (numSumResult < 10) {
                numSumResult ++;
                return {
                    label:          rowData.label,
                    value:          rowData.value,
                }
            }
        })
    );
},
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.