jQuery autocompletar con devolución de llamada ajax json

90

Estoy tratando de encontrar una manera de usar el autocompletado de jQuery con la fuente de devolución de llamada obteniendo datos a través de una lista de objetos ajax json del servidor.

¿Alguien podría dar algunas direcciones?

Lo busqué en Google pero no pude encontrar una solución completa.

RollRoll
fuente

Respuestas:

130

Perfectamente buen ejemplo en los documentos de Autocompletar con código fuente.

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>
charlietfl
fuente
11
este es un ejemplo de jquery ui.
Rafael Herscovici
En lugar de log () debería haber console.log ()
RN Kushwaha
4
@RNKushwaha Si lo nota, hay una función en la parte superior para el registro llamada log.
corsiKa
No puedo entender cómo funciona la success: function( data ) {response( data );} works inside the ajax call. I mean, what is that respuesta () `? Crea algunos <li>elementos de acuerdo con los datos, pero si quiero personalizar esos <li>elementos, ¿qué debo hacer? Me gustaría agregar un par de atributos ...
SagitarioA
2
Estoy trabajando en Rails, y mi controlador devuelve, format.json {render json: @ products.map (&: name) .to_json}, y tuve que eliminar el tipo de datos: "jsonp" en el ejemplo anterior para hacerlo trabajar.
franco
20

Si está devolviendo un objeto json complejo, debe modificar la función de éxito de su autocompletar de la siguiente manera.

$.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
            };
        }));
    }
});
shana
fuente
Para mí, esto está devolviendo un resultado vacío. El resultado en sí (tabla vacía) se muestra debajo del cuadro de entrada, pero no hay nada.
FrenkyB
10

Mi problema era que los usuarios finales comenzaban a escribir en un cuadro de texto y recibían sugerencias de autocompletar (ACP) y actualizaban el control de llamadas si se seleccionaba una sugerencia, ya que el ACP está diseñado de forma predeterminada. Sin embargo, también necesitaba actualizar muchos otros controles (cuadros de texto, DropDowns, etc.) con datos específicos de la selección del usuario final. He estado tratando de encontrar una solución elegante al problema y creo que vale la pena compartir la que desarrollé y, con suerte, le ahorrará al menos algo de tiempo.

WebMethod (SampleWM.aspx):

  • PROPÓSITO:

    • Para capturar los resultados del procedimiento almacenado de SQL Server y devolverlos como una cadena JSON al llamador AJAX
  • NOTAS:

    • Data.GetDataTableFromSP (): es una función personalizada que devuelve un DataTable a partir de los resultados de un procedimiento almacenado
    • <System.Web.Services.WebMethod (EnableSession: = True)> _
    • Función pública compartida GetAutoCompleteData (ByVal QueryFilterAs String) Como cadena

 //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

Autocompletar jQuery (AutoComplete.aspx):

  • PROPÓSITO:
    • Realice la solicitud Ajax al WebMethod y luego maneje la respuesta

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

Gran D
fuente
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));
        });
      }
    });
});

Código 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);
}
Desarrollador web Php
fuente
0

Usé la construcción de $.each (data [i], function (key, value) Pero debe hacer coincidir previamente los nombres de los campos de selección con los nombres de los elementos del formulario. Luego, en el ciclo después de "éxito", autocompleta elementos de la matriz "datos". Hizo esto: formulario autocompletado con éxito de ajax

Alejandro
fuente
0

Espero que esto ayude:

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);
        }
    });
});
Alex Ramírez
fuente