最近在搞博客搜索框的自动完成功能,用的是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; }