Autouzupełnianie jQuery za pomocą wywołania zwrotnego ajax json


90

Próbuję znaleźć sposób, aby użyć autouzupełniania jQuery ze źródłem wywołania zwrotnego pobierającego dane za pośrednictwem listy obiektów ajax json z serwera.

Czy ktoś mógłby podać jakieś wskazówki?

Wyszukałem w Google, ale nie mogłem znaleźć pełnego rozwiązania.

Odpowiedzi:


130

Doskonały przykład w dokumentach autouzupełniania z kodem źródłowym.

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
to jest przykład interfejsu użytkownika jQuery.
Rafael Herscovici

Zamiast log () powinno być console.log ()
RN Kushwaha

4
@RNKushwaha Jeśli zauważysz, na górze znajduje się funkcja do logowania o nazwie log.
corsiKa

Nie rozumiem, jak success: function( data ) {response( data );} works inside the ajax call. I mean, what is that działa response () `? Tworzy niektóre <li>elementy na podstawie danych, ale jeśli chcę dostosować te <li>elementy, co mam zrobić? Chciałbym dodać parę atrybutów ...
Strzelec A

2
Pracuję w Railsach i mój kontroler zwraca format.json {render json: @ products.map (&: name) .to_json} i musiałem usunąć typ danych: „jsonp” z powyższego przykładu, aby to zrobić pracować.
szczery

20

Jeśli zwracasz złożony obiekt json, musisz zmodyfikować funkcję powodzenia autouzupełniania w następujący sposób.

$.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
            };
        }));
    }
});

Dla mnie jest to zwracanie pustego wyniku. Sam wynik (pusta tabela) jest pokazany poniżej pola wprowadzania, ale niczego nie ma.
FrenkyB

10

Mój problem polegał na tym, że użytkownicy końcowi zaczęli pisać w polu tekstowym i otrzymywali sugestie autouzupełniania (ACP) i aktualizowali kontrolę połączeń, jeśli sugestia została wybrana, ponieważ ACP jest zaprojektowany domyślnie. Musiałem jednak również zaktualizować wiele innych formantów (pola tekstowe, DropDown, itp.) Z danymi specyficznymi dla wyboru użytkownika końcowego. Próbowałem znaleźć eleganckie rozwiązanie tego problemu i uważam, że to, które opracowałem, jest warte podzielenia się i mam nadzieję, że zaoszczędzi ci przynajmniej trochę czasu.

WebMethod (SampleWM.aspx):

  • CEL, POWÓD:

    • Aby przechwycić wyniki procedury składowanej SQL Server i zwrócić je jako ciąg JSON do obiektu wywołującego AJAX
  • UWAGI:

    • Data.GetDataTableFromSP () - to niestandardowa funkcja, która zwraca DataTable na podstawie wyników procedury składowanej
    • <System.Web.Services.WebMethod (EnableSession: = True)> _
    • Publiczna funkcja współdzielona 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):

  • CEL, POWÓD:
    • Wykonaj żądanie Ajax do metody WebMethod, a następnie obsłuż odpowiedź

    $(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));
        });
      }
    });
});

Kod 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

Mam nadzieję, że to pomoże:

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);
        }
    });
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.