2013-05-02 2 views
1

jQuery 자동 완성을 사용하여 약 2000 개의 레코드 목록에서 결과를 보여줍니다. 이 목록은 필자의 견해로는 오랫동안이 모든 레코드를 검색하기 위해 좋은 필터가 필요합니다.jQuery 자동 완성 UI 모든 방향 검색

레이블 필드뿐 아니라 값 필드에서도 검색 할 수 있도록 소스를 이미 수정했습니다. 지금 내가 원하는 것은 "삼성 갤럭시 S4"를 찾을 수있는 "S4 갤럭시"를 검색 할 수 있다는 것입니다. 표준 jquery 자동 완성은 왼쪽에서 오른쪽으로 만 검색 할 수 있으므로 "galaxy s4"는 발견되지만 "s4 galaxy"는 검색되지 않습니다. 나는 또한 "gal s4"를보고 "Samsung Galaxy S4"를 찾고 싶다. 지금

var completeResults = [{ 
    value: "S4 iv", 
    label: "Samsung Galaxy S4", 
    image: "samsung_galaxy_s_iv_1.jpg" 
}, { 
    value: "stackoverflow", 
    label: "Nokia lumia 920", 
    image: "nokia_lumia_920_1.jpg" 
}]; 

completeResults되어 경기가> "삼성 갤럭시 S4가"

전체 코드 내가 지금 아래 스탠드를 사용 굵게 만든 경우

은 추가, 그것은 좋은 것입니다 짧은 목록! Normaly 약 2000 기록.

function custom_source(request, response) { 
    var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); 
    response($.grep(completeResults, function (value) { 
     return matcher.test(value.value) || matcher.test(value.label); 
    })); 
} 

$("#s").autocomplete({ 
    source: custom_source, 
    minLength: 0 
}).data("ui-autocomplete")._renderItem = function (ul, item) { 
    var inner_html = "<a><img src='../img/type/120x200/" + item.image + "' width='21' height='35'/><span class='title'>" + item.label + "</span></a>"; 

    return $("<li></li>") 
     .data("item.autocomplete", item) 
     .append(inner_html) 
     .appendTo(ul); 
}; 
+0

많은 레코드를 사용하면 서버에서 검색하는 것이 더 나을 것입니다. –

+0

데이터베이스 쿼리가 적어지기 때문에 브라우저에서이 작업을 수행하려고합니다. 이 서버 측을 어떻게 처리 할 수 ​​있습니까? PHP로? 데이터베이스를 계속 쿼리하고 싶지는 않습니다. 왜냐하면 매일 수천 명의 사람들이이 데이터베이스를 사용한다면 많은 데이터베이스 사용량을 얻을 수 있기 때문입니다! – Timo002

+0

그건 사실인데, 확실히 트레이드 오프입니다. 웹 서버는 수천 개의 요청을 처리하도록 만들어졌습니다. 질문 하나 더 - 입력 한 경우 "노키아 삼성"두 결과를 모두 다시해야합니까? 또는 각 용어는 제안 항목에서 찾아야합니까? –

답변

2

좋아요. 여기서는 작동해야하는 항목이 있습니다 (텍스트를 생략 함). 기본적으로 전략은 다음과 같습니다.

  1. 사용자가 입력하는 각 용어에서 정규 표현식을 만듭니다. 입력을 ' '으로 나누면됩니다. 그 선택은 우리가
  2. 1 단계에서 추출 된 모든 단일 정규식과 일치하는 경우 가능한 선택 목록에있는 모든 선택에 대한
  3. 는 만 2 단계
function custom_source(request, response) { 
    // Create an array of regular expressions from the user's input: 
    var terms = $.map(request.term.split(' '), function (term) { 
     // Ignore just whitespace: 
     if ($.trim(term)) { 
      return new RegExp($.ui.autocomplete.escapeRegex(term), 'i'); 
     } 
    }); 

    response($.grep(completeResults, function (value) { 
     var found = true 
      , i 
      , regex; 

     // For every result, iterate over every term we extracted earlier and make sure it matches: 
     for (i = 0; i < terms.length && found; i++) { 
      regex = terms[i]; 
      found = found && (regex.test(value.value) || regex.test(value.label)); 
     } 

     return found; 
    })); 
} 
의 기준을 충족하는 값을 반환 참조

예 :http://jsfiddle.net/Aa5nK/73/

질문의 다른 부분은 다음과 같은 질문에 대한 답변 :

jQueryUI: how can I custom-format the Autocomplete plug-in results?

+0

유일한 것은 포맷 솔루션이 CSS 클래스를 사용하고 내장 스타일을 사용하지 않았 더라면 더 나은 포맷이라고 말할 수 있습니다. +1 링크 –

+0

위대한,이 잘 작동합니다! 나는 그것을 테스트 할 것이고, 만약 그렇다면, 이것이 답이 될 것입니다. 그러나 IE10에서는 매우 느립니다. 브라우저에서 모든 작업이 완료 되었기 때문에 문제가 발생합니까? 이 경우 서버 쪽이 더 좋을까요? 그렇다면 이미 준비된 파일에서이 작업을 수행하여 SQL 쿼리가 필요하지 않게 할 수 있습니다. – Timo002

+0

@ Timo002 : 각 정규식에 대해 테스트하는 대신 하나의 정규식을 사용할 수 있습니다. 브라우저가 필터를 사용하고 있기 때문에 속도가 느립니다. 1 초와 나는 대답을 업데이트 할 것이다 –