ฉันกำลังพยายามหาวิธีใช้การเติมข้อความอัตโนมัติ jQuery กับแหล่งเรียกกลับเพื่อรับข้อมูลผ่านรายการวัตถุ ajax json จากเซิร์ฟเวอร์
ใครช่วยชี้แนะได้บ้าง
ฉัน googled แต่ไม่พบวิธีแก้ปัญหาที่สมบูรณ์
ฉันกำลังพยายามหาวิธีใช้การเติมข้อความอัตโนมัติ jQuery กับแหล่งเรียกกลับเพื่อรับข้อมูลผ่านรายการวัตถุ ajax json จากเซิร์ฟเวอร์
ใครช่วยชี้แนะได้บ้าง
ฉัน googled แต่ไม่พบวิธีแก้ปัญหาที่สมบูรณ์
คำตอบ:
ตัวอย่างที่ดีอย่างสมบูรณ์แบบในเอกสารเติมข้อความอัตโนมัติด้วยซอร์สโค้ด
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
response () `ทำงานอย่างไร มันสร้าง<li>
องค์ประกอบบางอย่างตามข้อมูล แต่ถ้าฉันต้องการปรับแต่ง<li>
องค์ประกอบนั้นฉันควรทำอย่างไร? ฉันต้องการเพิ่มคุณสมบัติคู่ ...
หากคุณส่งคืนอ็อบเจ็กต์ 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
};
}));
}
});
ปัญหาของฉันคือผู้ใช้ปลายทางจะเริ่มพิมพ์ในกล่องข้อความและรับคำแนะนำในการเติมข้อความอัตโนมัติ (ACP) และอัปเดตการควบคุมการโทรหากเลือกข้อเสนอแนะเนื่องจาก ACP ได้รับการออกแบบโดยค่าเริ่มต้น อย่างไรก็ตามฉันจำเป็นต้องอัปเดตการควบคุมอื่น ๆ อีกหลายรายการ (กล่องข้อความ, DropDowns ฯลฯ ... ) ด้วยข้อมูลเฉพาะสำหรับการเลือกของผู้ใช้ปลายทาง ฉันพยายามหาวิธีแก้ปัญหาที่สวยงามและฉันรู้สึกว่าสิ่งที่ฉันพัฒนานั้นคุ้มค่าที่จะแบ่งปันและหวังว่าจะช่วยให้คุณประหยัดเวลาได้บ้าง
WebMethod (SampleWM.aspx):
วัตถุประสงค์:
หมายเหตุ:
//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):
$(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);
}
});
});
$(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);
}
ฉันใช้โครงสร้างของ$.each (data [i], function (key, value)
แต่คุณต้องจับคู่ชื่อของฟิลด์การเลือกล่วงหน้ากับชื่อขององค์ประกอบแบบฟอร์ม จากนั้นในลูปหลังจาก "สำเร็จ" ให้เติมองค์ประกอบอัตโนมัติจากอาร์เรย์ "ข้อมูล" ทำสิ่งนี้: กรอกแบบฟอร์มอัตโนมัติพร้อมกับ ajax สำเร็จ
ฉันหวังว่านี่จะช่วยได้:
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);
}
});
});