jquery.autocomplete调用asp.net的WebService完美实现类似于淘宝自动完成的效果

在实际使用中,感觉淘宝搜索的自动完成功能做的很人性化,有内容提示还有记录显示。如下图:jquery.autocomplete调用asp.net的WebService完美实现类似于淘宝自动完成的效果_第1张图片

 

看见如此效果,心的砰砰砰的直跳。于是自己也开始学着实现这种效果。以下是自己做好后的效果。如图:

 jquery.autocomplete调用asp.net的WebService完美实现类似于淘宝自动完成的效果_第2张图片

 

 

 

废话不多说,直接上教程:

 

开发环境:vs2005,XP系统,ie6 浏览器(为了向后支持,所以没有用高版本ie浏览器,用的是纯净的ie6)、火狐浏览器3.6.6

第三方文件:

  json2.js          下载地址:http://www.json.org/json2.js               中文官网:http://www.json.org/json-zh.html

 

  (如果你在后台cs文件里,手动拼写JSON格式字符串,可以不下载此dll。建议下载使用)

  Jayrock.Json.dll     下载地址:http://download.berlios.de/jayrock/jayrock-0.9.8316-bin.zip  

                官方网站:http://jayrock.berlios.de/      

                参考资料:http://msdn.microsoft.com/zh-cn/library/bb299886.aspx

 

  jquery-1.4.1.js       这里就不附下载地址了

 

  jquery.autocomplete.js 

  jquery.autocomplete.css 下载地址:http://jquery.bassistance.de/autocomplete/jquery.autocomplete.zip

                官方网站:http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete

 

  下载完jquery.autocomplete.js后,还不能立即开始做程序。我们需要对jquery.autocomplete.js源文件有几处地方进行修改。

  为了给大家省事,现在附上我修改后的jquery.autocomplete.js文件。下载文件

第一处:大约在200行 (修改后,可以支持在火狐浏览器中使用中文输入)

源代码:                                                  

  
  
}).bind( "unautocomplete", function () {
select.unbind();
$input.unbind();
$(input.form).unbind(
".autocomplete" );
});

修改后代码:

  
  
}).bind( "unautocomplete" , function () {
select.unbind();
$input.unbind();
$(input.form).unbind(
".autocomplete" );
}).bind(
"input" , function () {
onChange(
0 , true );
});

 

第二处:大约在源代码361行

源代码: 

源代码
   
   
$.ajax({
  // try to leverage ajaxQueue plugin to abort previous requests
  mode: "abort" ,
// limit abortion to this input
port: "autocomplete" + input.name,
dataType: options.dataType,
url: options.url,
data: $.extend({
q: lastWord(term),
limit: options.max
}, extraParams),
success:
function (data) {
var parsed = options.parse && options.parse(data) || parse(data);
cache.add(term, parsed);
success(term, parsed);
}
});

 

修改后代码: 

修改后代码
   
   
$.ajax({
  // try to leverage ajaxQueue plugin to abort previous requests
  mode: "abort" ,
  // limit abortion to this input
port: "autocomplete" + input.name,

type:
"POST" , //使用POST方式向webservice提交
contentType:
"application/json;charset=utf-8" , //提交数据格式为json
dataType:
"json" , //返回数据格式json格式的字符串
url: options.url, //提交地址
/*这里使用json2.js里的JSON.stringify()方法,把json对象转换成字符串
      如果不进行转换提交会报错*/

data:JSON.stringify($.extend({
q: lastWord(term), //这里指定了参数‘q’,则webservice方法里的参数名必须为'q'
limit: options.max //最大返回条数,webservice方法里可以无此参数
},extraParams)),

 success:
function (data) {
var parsed = options.parse && options.parse(data) || parse(data);
cache.add(term, parsed);
success(term, parsed);
},
error:
function (x, textStatus, errorThrown) {
alert(
"Ajax调用错误:" + x.responseText);
}
});

  

 第三处:大约在源代码388行

源代码:

源代码
   
   
  function parse(data) {
var parsed = [];
var rows = data.split( "\n" );
for ( var i = 0 ; i < rows.length; i ++ ) {
var row = $.trim(rows[i]);
if (row) {
row
= row.split( "|" );
parsed[parsed.length]
= {
data: row,
value: row[
0 ],
result: options.formatResult
&& options.formatResult(row, row[ 0 ]) || row[ 0 ]
};
}
}
return parsed;
};
 

 

修改后代码:

 

修改后代码
   
   
  function parse(data) {
var parsed = [];
// 经过修改后的代码返回data是JSON格式的字符串
var jsons = eval( "(" + data + ")" ); // 返回的数据转换成JSON对象
for ( var i = 0 ; i < jsons.length; i ++ ) {
var json = jsons[i];
if (json) {
/* val只保存第一列值
当页面选中提示项后,自动把此值填入到文本框中
*/
var val;
for ( var key in json){ // 由于不知道JSON对象的key值,只能循环读取
val = json[key]; break ;
}
parsed[parsed.length]
= {
data: json,
value: val,
result: options.formatResult
&& options.formatResult(json, val) || val
};
}
}
return parsed;
};
 

 

 修改完js文件后便可开工了。。下面上传页面代码,我做的范例里使用母版页,所以大家看起来有些别捏。请大家多多包含。

aspx代码:

页面代码
   
   
<% @ Page Language = " C# " MasterPageFile = " ~/MasterPage.master " AutoEventWireup = " true " CodeFile = " Default.aspx.cs " Inherits = " jquery_autocomplete_Default " Title = " Untitled Page " %>
< asp:Content ID = " Content1 " ContentPlaceHolderID = " HeadContent " Runat = " Server " >
< link rel = " stylesheet " href = " css/jquery.autocomplete.css " type = " text/css " />
< script type = " text/javascript " src = " http://www.cnblogs.com/js/jquery-1.4.1.js " ></ script >
< script type = " text/javascript " src = " js/jquery.autocomplete.js " ></ script >
< script type = " text/javascript " src = " js/json2.js " ></ script >
< script type = " text/javascript " >
$().ready(function() {
$(
" #<%=_txtUserName.ClientID %> " ).focus().autocomplete(
' <%=ResolveClientUrl("~/WebService.asmx/HelloWorld") %> ' ,
{
minChars:
1 ,
autoFill:
false ,
width:
" 152px " ,
scroll:
false ,
formatItem: function(result,i,max){
// 这里返回的result为一个已封装好的JSON对象
// i为第几条数据,从1开始;max为共多少条数据
// 返回参数里也可以只有一个参数result
var item = " <table id='auto " + i + " ' style='width:100%;'><tr><td align='left'> "
+ result.uname + " </td><td align='right' style='color:green;'> "
+ i + " </td></tr></table> " ;
return item;
}
}
);
});
</ script >
</ asp:Content >
< asp:Content ID = " Content2 " ContentPlaceHolderID = " ContentPlaceHolder1 " Runat = " Server " >

< asp:TextBox ID = " _txtUserName " runat = " server " Width = " 150px " BorderWidth = " 1px " ></ asp:TextBox >

</ asp:Content >

 

webservice代码:

WebService代码
   
   
using System;
using System.Web;
using System.Collections;
using System.Collections.Generic;
using System.Web.Services;
using System.Web.Services.Protocols;

using System.Data;
using TestBLL;
using TestModel;
using Jayrock.Json.Conversion;
using System.Text;
/// <summary>
/// WebService 的摘要说明
/// </summary>
[WebService(Namespace = " http://tempuri.org/ " )]
[WebServiceBinding(ConformsTo
= WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{

public WebService()
{

// 如果使用设计的组件,请取消注释以下行
// InitializeComponent();
}

[WebMethod]
public string HelloWorld( string q)
{
string str = "" ;
DataTable table
= new CommonBLL().ExecuteDataSet( " select UserName,CONVERT(varchar(12),Birthday,111) Birthday from [User] where UserName like '% " + q + " %' " ).Tables[ 0 ];
Jayrock.Json.JsonArray jsonList
= new Jayrock.Json.JsonArray();
Jayrock.Json.JsonObject json;
foreach (DataRow row in table.Rows)
{
json
= new Jayrock.Json.JsonObject();
json.Accumulate(
" uname " , row[ " UserName " ]);
json.Accumulate(
" day " , row[ " Birthday " ]);
jsonList.Add(json);
}
str
= jsonList.ToString();
return str;
}

}

 

 

 

 注意:切忌要在配置文件中 <system.web>节点下加入如下配置,否则会报因URL意外地以”/…”结束的错误

 

<system.web>
  
  
  < webServices >
  
< protocols >
  
< add name ="HttpPost" />
< add name ="HttpGet" />
</ protocols >
</ webServices >
</ system.web >

 

 

 如果此篇文章对你有帮助,麻烦您请顶下。您的支持就是我最大的动力!!

 

你可能感兴趣的:(autocomplete)