jQuery автозаповнення із зворотним викликом ajax json


90

Я намагаюся знайти спосіб використання автозаповнення jQuery з джерелом зворотного виклику, що отримує дані через список об'єктів ajax json із сервера.

Хтось може дати деякі вказівки?

Я погуглив, але не міг знайти повного рішення.

Відповіді:


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.
Рафаель Герсковічі,

Замість log () має бути console.log ()
Р.Н. Кушваха

4
@RNKushwaha Якщо ви помітили, у верхній частині є функція для реєстрації, що називається log.
corsiKa

Я не можу зрозуміти, як функціонує success: function( data ) {response( data );} works inside the ajax call. I mean, what is that response () `? Він створює деякі <li>елементи відповідно до даних, але якщо я хочу налаштувати ці <li>елементи, що мені робити? Я хотів би додати пару атрибутів ...
Стрілець

2
Я працюю в Rails, і мій контролер повертає format.json {render json: @ products.map (&: name) .to_json}, і мені довелося видалити тип даних: "jsonp" у прикладі вище, щоб це зробити працювати.
відвертий

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 за замовчуванням розроблена. Однак мені також потрібно було оновити кілька інших елементів керування (текстові поля, DropDowns тощо ...) даними, специфічними для вибору кінцевого користувача. Я намагався знайти елегантне рішення проблеми, і я вважаю, що тим, що я розробив, варто поділитися, і, сподіваюся, це заощадить вам хоча б трохи часу.

WebMethod (SampleWM.aspx):

  • МЕТА:

    • Щоб отримати результати збереженої процедури SQL Server та повернути їх як рядок JSON абоненту AJAX
  • ПРИМІТКИ:

    • Data.GetDataTableFromSP () - це спеціальна функція, яка повертає DataTable з результатів збереженої процедури
    • <System.Web.Services.WebMethod (EnableSession: = True)> _
    • Загальнодоступна функція GetAutoCompleteData (ByVal QueryFilterAs 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

Автозаповнення jQuery (AutoComplete.aspx):

  • МЕТА:
    • Виконайте запит Ajax до WebMethod, а потім обробіть відповідь

    $(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);
        }
    });
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.