jQuery UI 자동 완성에서 결과 제한


126

jQuery UI 자동 완성을 사용하고 있습니다.

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

최대 매개 변수가 작동하지 않고 여전히 10 개 이상의 결과를 얻습니다. 뭔가 빠졌습니까?


11
라는 옵션이 없습니다 max자동 완성에이
얀타 랄 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

이 솔루션의 +1 더 많은 결과를 좁히기 위해 minLength : 3을 추가하겠습니다. jsfiddle.net/vqwBP/295
Adrian P.

2
jsFiddle에서 제공된 솔루션에서 슬라이스 값을 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에 동의하십시오. 게임이 JS 인 경우 CSS를 사용하지 마십시오.
Adrian P.

사전 응용 프로그램에서도 같은 작업을 수행했습니다. 그 가치가 있습니다!
Moxet Jan

25

"Jayantha"와 마찬가지로 CSS를 사용하는 것이 가장 쉬운 방법이지만 더 나은 방법 일 수 있습니다.

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

유일한 차이점은 "최대 높이"입니다. 이렇게하면 위젯이 더 작은 높이로 크기를 조정할 수 있지만 200px를 넘지 않아야합니다


4
당신의 해결책 때문에. jQuery 솔루션에 대해 논의하고있는 것은 유효한 것입니다. jQuery로 문제를 해결할 수있을 때 프로그래머에게 CSS 솔루션을 제공하는 것은 좋은 생각이 아닙니다. 그리고 결국 이것은 수락 된 답변에서와 같이 문제를 해결하지 않는 결과를 가리 킵니다. 여기 있습니다!
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

이것은 내가 찾던 xactly입니다! 결과의 수를 제한하지 않고 으깬 아이템의 수를 제한합니다! thx
Serge insas

왜이 답변에 약간의 공감대가 있습니까? 문제가 있습니까? 적어도 첫눈에 나를 위해 일했습니다.
Szybki

3

결과가 mysql 쿼리에서 나온 경우 mysql 결과를 직접 제한하는 것이 더 효율적입니다.

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

여기서 10은 원하는 최대 행 수입니다.


1
모든 마우스 위로 DB를 쿼리하는 것은 좋지 않습니다! 일부 서버 또는 거대한 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

내 경우에는 잘 작동합니다.

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.