所以我的 jquery 自动完成“工作”了,但它有点烦躁,因为每次 keydown() 触发时我都会调用 webservice 方法,所以我有很多方法挂起,有时让“自动”工作我必须把它打出来然后退格一点,因为我假设它的返回值有点慢。我已将查询结果限制为 8 以尽量减少时间。有什么我可以做的让这个更活泼一点吗?如果我不提高它的响应速度,这东西似乎几乎没用。
JavaScript
$("#clientAutoNames").keydown(function () {
$.ajax({
type: "POST",
url: "WebService.asmx/LoadData",
data: "{'input':" + JSON.stringify($("#clientAutoNames").val()) + "}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
if (data.d != null) {
var serviceScript = data.d;
}
$("#autoNames").html(serviceScript);
$('#clientAutoNames').autocomplete({
minLength: 2,
source: autoNames,
delay: 100,
focus: function (event, ui) {
$('#project').val(ui.item.label);
return false;
},
select: function (event, ui) {
$('#clientAutoNames').val(ui.item.label);
$('#projectid').val(ui.item.value);
$('#project-description').html(ui.item.desc);
pkey = $('#project-id').val;
return false;
}
})
.data("autocomplete")._renderItem = function (ul, item) {
return $("<li></li>")
.data("item.autocomplete", item)
.append("<a>" + item.label + "<br>" + item.desc + "</a>")
.appendTo(ul);
}
}
});
});
网络服务.asmx
<WebMethod()> _
Public Function LoadData(ByVal input As String) As String
Dim result As String = "<script>var autoNames = ["
Dim sqlOut As Data.SqlClient.SqlDataReader
Dim connstring As String = *Datasource*
Dim strSql As String = "SELECT TOP 2 * FROM v_Clients WHERE (SearchName Like '" + input + "%') ORDER BY SearchName"
Dim cnn As Data.SqlClient.SqlConnection = New Data.SqlClient.SqlConnection(connstring)
Dim cmd As Data.SqlClient.SqlCommand = New Data.SqlClient.SqlCommand(strSql, cnn)
cnn.Open()
sqlOut = cmd.ExecuteReader()
Dim c As Integer = 0
While sqlOut.Read()
result = result + "{"
result = result + "value: '" + sqlOut("ContactID").ToString() + "',"
result = result + "label: '" + sqlOut("SearchName").ToString() + "',"
'result = result + "desc: '" + title + " from " + company + "',"
result = result + "},"
End While
result = result + "];</script>"
sqlOut.Close()
cnn.Close()
Return result
End Function
我确定我只是在解决这个问题时犯了一点错误,或者没有更好地平衡通话或其他事情。
非常感谢!
最佳答案
首先,您必须调整您的查询。您没有使用参数化查询,所以您只是在乞求 SQL injection攻击。
同样,您必须先解决这个问题!
完成后,使用“延迟”值。我假设这是在将查询发送到服务器之前在按键之间等待的时间量?您希望它等待您的用户暂停他们的输入,然后发送请求,以避免无关的调用使您的服务器重载。
您还应该使用 try..catch..finally 并在完成后处理您的连接。
顺便说一句,如果您的查询执行不佳,请尝试在该列上添加索引。如果你没有索引,“喜欢”语句就很糟糕......
关于asp.net - 加快 Web 服务的自动完成速度并避免过多的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3025692/