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>
log
.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 ...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 }; })); } });
źródło
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:
UWAGI:
//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):
$(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); } }); });
źródło
$(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); }
źródło
Użyłem konstrukcji
$.each (data [i], function (key, value)
Ale musisz wstępnie dopasować nazwy pól wyboru z nazwami elementów formularza. Następnie w pętli po „sukcesie” autouzupełnianie elementów z tablicy „data”. Zrobiłem to: autouzupełnianie formularza z sukcesem AJAXźródło
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); } }); });
źródło