jQuery เติมข้อความอัตโนมัติด้วยการโทรกลับ ajax json


92

ฉันกำลังพยายามหาวิธีใช้การเติมข้อความอัตโนมัติ jQuery กับแหล่งเรียกกลับเพื่อรับข้อมูลผ่านรายการวัตถุ ajax json จากเซิร์ฟเวอร์

ใครช่วยชี้แนะได้บ้าง

ฉัน googled แต่ไม่พบวิธีแก้ปัญหาที่สมบูรณ์

คำตอบ:


131

ตัวอย่างที่ดีอย่างสมบูรณ์แบบในเอกสารเติมข้อความอัตโนมัติด้วยซอร์สโค้ด

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

แทนที่จะเป็น log () ควรมี 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>องค์ประกอบนั้นฉันควรทำอย่างไร? ฉันต้องการเพิ่มคุณสมบัติคู่ ...
ราศีธนู

2
ฉันทำงานใน Rails และตัวควบคุมของฉันส่งคืนรูปแบบ json {render json: @ products.map (&: name) .to_json} และฉันต้องลบประเภทข้อมูล: "jsonp" ในตัวอย่างด้านบนเพื่อให้ได้ ไปทำงาน.
ตรงไปตรงมา

21

หากคุณส่งคืนอ็อบเจ็กต์ 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

11

ปัญหาของฉันคือผู้ใช้ปลายทางจะเริ่มพิมพ์ในกล่องข้อความและรับคำแนะนำในการเติมข้อความอัตโนมัติ (ACP) และอัปเดตการควบคุมการโทรหากเลือกข้อเสนอแนะเนื่องจาก ACP ได้รับการออกแบบโดยค่าเริ่มต้น อย่างไรก็ตามฉันจำเป็นต้องอัปเดตการควบคุมอื่น ๆ อีกหลายรายการ (กล่องข้อความ, DropDowns ฯลฯ ... ) ด้วยข้อมูลเฉพาะสำหรับการเลือกของผู้ใช้ปลายทาง ฉันพยายามหาวิธีแก้ปัญหาที่สวยงามและฉันรู้สึกว่าสิ่งที่ฉันพัฒนานั้นคุ้มค่าที่จะแบ่งปันและหวังว่าจะช่วยให้คุณประหยัดเวลาได้บ้าง

WebMethod (SampleWM.aspx):

  • วัตถุประสงค์:

    • เพื่อดักจับผลลัพธ์ SQL Server Stored Procedure และส่งคืนเป็นสตริง JSON ไปยัง AJAX Caller
  • หมายเหตุ:

    • Data.GetDataTableFromSP () - เป็นฟังก์ชันแบบกำหนดเองที่ส่งคืน DataTable จากผลลัพธ์ของ Stored Procedure
    • <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);
        }
    });
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.