最近在搞博客搜索框的自动完成功能,用的是JQuery UI里的autocomplete插件。插件的数据源是用AJAX调用一个WebService,网站后台有个标签库,WebService返回的是符合条件的标签。最终效果如下:
我们先来看WebService的代码,方法很简单:
[WebMethod]
public List<EdiBlog.Core.DataModel.TagCloud> GetAllTagsForAutoComplete(string tagName)
{
return optTag.GetModelList().Where(p => p.Name.ToLower().StartsWith(tagName.ToLower())).ToList();
}
这个方法的作用是根据输入的内容,检索所有以tagName开头的标签。我没有返回全部标签,是因为autocomplete插件的默认行为不符合我的需求。在默认情况下,如果我输入“as”,则"ascx"和"javascript"都会被显示。所以我做的这个WebService进行了一定的处理,只返回StartsWith关键词的标签。
这个TagCloud类型很简单,仅仅只有2个属性。一个是Name,表示名称,另一个是Count,表示出现次数。这里我们只需要Name。
public class TagCloud
{
public string Name { get; set; }
public int Count { get; set; }
}
另外,别忘了把“[System.Web.Script.Services.ScriptService] ”取消注释。不然脚本调用不了WebService。
我们再来看看脚本和HTML部分。
需要引用的除了JQuery库,还要JQuery UI库,我用的版本是“jquery-ui-1.8.16.custom.min.js”。
HTML代码(ASPX):
<asp:TextBox ID="txtSearch" CssClass="searchtext" MaxLength="30" runat="server" ToolTip="Search"></asp:TextBox>
它最后表现在网页上,是一个input type="text"的搜索框。
JQuery代码:
$(function () {
$(".searchtext").autocomplete({
source: function (request, response) {
$.ajax({
url: "/API/BlogService.asmx/GetAllTagsForAutoComplete",
data: "{ 'tagName': '" + request.term + "'}",
dataType: "json",
type: "POST",
contentType: "application/json; charset=utf-8",
dataFilter: function (data) {
return data;
},
success: function (data) {
response($.map(data.d, function (item) {
return {
value: item.Name
}
}))
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus + ": " + errorThrown);
}
})
},
minLength: 1
});
});
这段代码里,
data: "{ 'tagName': '" + request.term + "'}"
是给GetAllTagsForAutoComplete方法传参数,参数是用户输入的内容。
minLength: 1
表示至少输入一个字符时,开始自动完成。
value: item.Name
是访问Name属性,这个Name就是TagCloud类型里的Name,因为被解析成了JSON,我们可以直接用"."来访问,不用["Name"]去访问了。
如果你没有引用JQuery UI的CSS库,可以自己做一些样式,比如本人博客的:
ul.ui-autocomplete
{
border: 1px solid #DDD;
background-color: #FFF;
width: 280px;
}
ul.ui-autocomplete li a
{
padding: 5px;
display: block;
}
.ui-state-hover
{
background-color: #D8DFEA;
}