转自:http://www.wyjexplorer.cn/Blog/View/8DBEA52E59C7021D.html
最近在搞博客搜索框的自动完成功能,用的是JQuery UI里的autocomplete插件。插件的数据源是用AJAX调用一个WebService,网站后台有个标签库,WebService返回的是符合条件的标签。最终效果如下:

我们先来看WebService的代码,方法很简单:
2 | public List<EdiBlog.Core.DataModel.TagCloud> GetAllTagsForAutoComplete( string tagName) |
4 | return optTag.GetModelList().Where(p => p.Name.ToLower().StartsWith(tagName.ToLower())).ToList(); |
这个方法的作用是根据输入的内容,检索所有以tagName开头的标签。我没有返回全部标签,是因为autocomplete插件的默认行为不符合我的需求。在默认情况下,如果我输入“as”,则"ascx"和"javascript"都会被显示。所以我做的这个WebService进行了一定的处理,只返回StartsWith关键词的标签。
这个TagCloud类型很简单,仅仅只有2个属性。一个是Name,表示名称,另一个是Count,表示出现次数。这里我们只需要Name。
3 | public string Name { get ; set ; } |
4 | 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):
1 | < asp:TextBox ID = "txtSearch" CssClass = "searchtext" MaxLength = "30" runat = "server" ToolTip = "Search" ></ asp:TextBox > |
它最后表现在网页上,是一个input type="text"的搜索框。
JQuery代码:
02 | $( ".searchtext" ).autocomplete({ |
03 | source: function (request, response) { |
05 | url: "/API/BlogService.asmx/GetAllTagsForAutoComplete" , |
06 | data: "{ 'tagName': '" + request.term + "'}" , |
09 | contentType: "application/json; charset=utf-8" , |
10 | dataFilter: function (data) { |
13 | success: function (data) { |
14 | response($.map(data.d, function (item) { |
20 | error: function (XMLHttpRequest, textStatus, errorThrown) { |
21 | alert(textStatus + ": " + errorThrown); |
这段代码里,
data: "{ 'tagName': '" + request.term + "'}"
是给GetAllTagsForAutoComplete方法传参数,参数是用户输入的内容。
表示至少输入一个字符时,开始自动完成。
是访问Name属性,这个Name就是TagCloud类型里的Name,因为被解析成了JSON,我们可以直接用"."来访问,不用["Name"]去访问了。
如果你没有引用JQuery UI的CSS库,可以自己做一些样式,比如本人博客的:
03 | border : 1px solid #DDD ; |
04 | background-color : #FFF ; |
08 | ul.ui-autocomplete li a |
16 | background-color : #D8DFEA ; |