콜백 Ajax JSON을 사용한 jQuery 자동 완성


90

서버에서 ajax json 객체 목록을 통해 데이터를 가져 오는 콜백 소스와 함께 jQuery 자동 완성을 사용하는 방법을 찾으려고합니다.

아무도 지시를 줄 수 있습니까?

나는 그것을 봤지만 완전한 해결책을 찾지 못했습니다.

답변:


128

소스 코드 가있는 자동 완성 문서 의 완벽한 예입니다 .

jQuery

<script>
  $(function() {
    function log( message ) {
      $( "<div>" ).text( message ).prependTo( "#log" );
      $( "#log" ).scrollTop( 0 );
    }

    $( "#city" ).autocomplete({
      source: function( request, response ) {
        $.ajax({
          url: "http://gd.geobytes.com/AutoCompleteCity",
          dataType: "jsonp",
          data: {
            q: request.term
          },
          success: function( data ) {
            response( data );
          }
        });
      },
      minLength: 3,
      select: function( event, ui ) {
        log( ui.item ?
          "Selected: " + ui.item.label :
          "Nothing selected, input was " + this.value);
      },
      open: function() {
        $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
      },
      close: function() {
        $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
      }
    });
  });
</script>

HTML

<div class="ui-widget">
  <label for="city">Your city: </label>
  <input id="city">
  Powered by <a href="http://geonames.org">geonames.org</a>
</div>

<div class="ui-widget" style="margin-top:2em; font-family:Arial">
  Result:
  <div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div>
</div>

11
이것은 jquery ui 예제입니다.
Rafael Herscovici 2013

대신 로그의 () ()이 CONSOLE.LOG해야한다
RN Kushwaha

4
@RNKushwaha 눈치 채 셨다면 맨 위에라는 로깅 기능이 log있습니다.
corsiKa

success: function( data ) {response( data );} works inside the ajax call. I mean, what is that response ()`가 어떻게 작동 하는지 이해할 수 없습니까? <li>데이터에 따라 일부 요소를 생성하지만 해당 <li>요소 를 사용자 정의하려면 어떻게해야합니까? 나는 ... 속성 쌍을 추가하고 싶습니다
SagittariusA

2
저는 Rails에서 작업 중이며 컨트롤러가 format.json {render json : @ products.map (& : name) .to_json}을 반환하고이를 위해 위의 예에서 "jsonp"데이터 유형을 제거해야했습니다. 일하다.
frank

20

복잡한 json 객체를 반환하는 경우 다음과 같이 자동 완성의 성공 기능을 수정해야합니다.

$.ajax({
    url: "/Employees/SearchEmployees",
    dataType: "json",
    data: {
        searchText: request.term
    },
    success: function (data) {
        response($.map(data.employees, function (item) {
            return {
                label: item.name,
                value: item.id
            };
        }));
    }
});

나를 위해 이것은 빈 결과를 반환합니다. 결과 자체 (빈 테이블)가 입력 상자 아래에 표시되지만 아무것도 없습니다.
FrenkyB

10

내 문제는 최종 사용자가 텍스트 상자에 입력을 시작하고 자동 완성 (ACP) 제안을 받고 ACP가 기본적으로 설계되어 제안이 선택되면 호출 제어를 업데이트한다는 것입니다. 그러나 최종 사용자의 선택과 관련된 데이터로 여러 다른 컨트롤 (텍스트 상자, 드롭 다운 등)을 업데이트해야했습니다. 나는 문제에 대한 우아한 해결책을 찾으려고 노력해 왔으며 내가 개발 한 것이 공유 할 가치가 있다고 생각하며 적어도 시간을 절약 할 수 있기를 바랍니다.

WebMethod (SampleWM.aspx) :

  • 목적:

    • SQL Server 저장 프로 시저 결과를 캡처하고 AJAX 호출자에게 JSON 문자열로 반환하려면
  • 메모:

    • Data.GetDataTableFromSP ()-저장 프로 시저의 결과에서 DataTable을 반환하는 사용자 지정 함수입니다.
    • <System.Web.Services.WebMethod (EnableSession : = True)> _
    • 공용 공유 함수 GetAutoCompleteData (ByVal QueryFilterAs String) As String

 //Call to custom function to return SP results as a DataTable
 // DataTable will consist of Field0 - Field5
 Dim params As ArrayList = New ArrayList
 params.Add("@QueryFilter|" & QueryFilter)
 Dim dt As DataTable = Data.GetDataTableFromSP("AutoComplete", params, [ConnStr])

 //Create a StringBuilder Obj to hold the JSON 
 //IE: [{"Field0":"0","Field1":"Test","Field2":"Jason","Field3":"Smith","Field4":"32","Field5":"888-555-1212"},{"Field0":"1","Field1":"Test2","Field2":"Jane","Field3":"Doe","Field4":"25","Field5":"888-555-1414"}]
 Dim jStr As StringBuilder = New StringBuilder

 //Loop the DataTable and convert row into JSON String
 If dt.Rows.Count > 0 Then
      jStr.Append("[")
      Dim RowCnt As Integer = 1
      For Each r As DataRow In dt.Rows
           jStr.Append("{")
           Dim ColCnt As Integer = 0
           For Each c As DataColumn In dt.Columns
               If ColCnt = 0 Then
                   jStr.Append("""" & c.ColumnName & """:""" & r(c.ColumnName) & """")
               Else
                   jStr.Append(",""" & c.ColumnName & """:""" & r(c.ColumnName) & """")
                End If
                ColCnt += 1
            Next

            If Not RowCnt = dt.Rows.Count Then
                jStr.Append("},")
            Else
                jStr.Append("}")
            End If

            RowCnt += 1
        Next

        jStr.Append("]")
    End If

    //Return JSON to WebMethod Caller
    Return jStr.ToString

AutoComplete jQuery (AutoComplete.aspx) :

  • 목적:
    • WebMethod에 Ajax 요청을 수행 한 다음 응답을 처리합니다.

    $(function() {
      $("#LookUp").autocomplete({                
            source: function (request, response) {
                $.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    url: "SampleWM.aspx/GetAutoCompleteData",
                    dataType: "json",
                    data:'{QueryFilter: "' + request.term  + '"}',
                    success: function (data) {
                        response($.map($.parseJSON(data.d), function (item) {                                
                            var AC = new Object();

                            //autocomplete default values REQUIRED
                            AC.label = item.Field0;
                            AC.value = item.Field1;

                            //extend values
                            AC.FirstName = item.Field2;
                            AC.LastName = item.Field3;
                            AC.Age = item.Field4;
                            AC.Phone = item.Field5;

                            return AC
                        }));       
                    }                                             
                });
            },
            minLength: 3,
            select: function (event, ui) {                    
                $("#txtFirstName").val(ui.item.FirstName);
                $("#txtLastName").val(ui.item.LastName);
                $("#ddlAge").val(ui.item.Age);
                $("#txtPhone").val(ui.item.Phone);
             }                    
        });
     });


2
$(document).on('keyup','#search_product',function(){
    $( "#search_product" ).autocomplete({
      source:function(request,response){
                  $.post("<?= base_url('ecommerce/autocomplete') ?>",{'name':$( "#search_product" ).val()}).done(function(data, status){

                    response(JSON.parse(data));
        });
      }
    });
});

PHP 코드 :

public function autocomplete(){
    $name=$_POST['name'];
    $result=$this->db->select('product_name,sku_code')->like('product_name',$name)->get('product_list')->result_array();
    $names=array();
    foreach($result as $row){
        $names[]=$row['product_name'];
    }
    echo json_encode($names);
}

0

구성을 사용했지만 $.each (data [i], function (key, value) 선택 필드의 이름을 양식 요소의 이름과 미리 일치시켜야합니다. 그런 다음 "성공"후 루프에서 "데이터"배열의 요소를 자동 완성합니다. 이것을 했습니까? ajax 성공으로 자동 완성 양식


0

이게 도움이 되길 바란다:

var token = document.getElementById('token').value;
var nombre = document.getElementById('txtNombre').value;    

$("#txtNombre").keyup(function () {
    $.ajax({
        type: "POST",
        url: host() + "Formulario/BuscarNombreAutocompletar/",
        data: JSON.stringify({ "nombre": nombre }),
        headers: {
            'Authorization': 'Bearer ' + token
        },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            var dataArray = [];
            if (controlCarga(data)) {

                $.each(data[1], function (i, item) {
                    dataArray.push(item.frmNombre)
                });

                $('#txtNombre').autocomplete({
                    clearButton: true,
                    source: dataArray,
                    selectFirst: true,
                    minLength: 2
                });
            }
        },
        error: function (xhr, textStatus, errorThrown) {
            console.log('Error: ' + xhr.responseText);
        }
    });
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.