您的位置:首页 > Web前端 > JavaScript

使用javascript ajax C#实现类似百度的搜索框效果

2014-04-30 16:17 1106 查看
先看一下最终效果 样式不太好看,但是功能是完全可行的,在文本框中输入文字之后,会实现自动搜索的功能。



首先介绍一下原理:

文本框下方是一个div,里面是一个ul标签,初始状态此ul中不包含任何的li标签。

当文本框文字改变的时候,使用ajax把文本框内容取出来,传递到后台,在后台中从数据库查询数据并把结果返回到前台页面。

返回的结果格式设置为:A,B,C,D;以便在前台实现字符串分割。

前台页面把返回的字符串切分成数组,依次遍历并给ul添加li节点。

具体方法:

①前台布局就不多说了 ,重要的是给文本框添加事件 onPropertyChange ="change(this)" ,当文字改变时触发,这个是在IE下的,火狐也有对应的,大家可以搜索一下。

@js代码:

<script language="javascript" type="text/javascript">
function ajax(url, funSucc, fail) {
//1.解决浏览器兼容性问题 创建AJAX对象
if (window.XMLHttpRequest) {
var oAjax = new XMLHttpRequest();
}
else {
var oAjax = new ActiveXObject("Microsoft.XMLHTTP");
}
//2.连接服务器
oAjax.open("GET", url, true);
//3.发送请求
oAjax.send();
//4.接收返回
oAjax.onreadystatechange = function () {

if (oAjax.readyState == 4) { //响应解析完成
if (oAjax.status == 200) {
funSucc(oAjax.responseText);

}
else { if (fail) { fail(oAjax.status); } }

}

}

};

function change(obj) {
var odiv = document.getElementById("div_context");
odiv.style.display = "block";       //div默认不可见,文文字改变之后变为可见状态
var text = document.getElementById("Text1");
var add_ul = document.getElementById("ul_1");
add_ul.innerHTML = "";              //每次改变之后,先把之前的内容清空
var input = obj.value;
var url = "search.aspx?search=" + input + "&t=" + Math.random(); //给后台传参,防止缓存
var arr = new Array();              //保存数据用的数组

ajax(url, function (retext) {       //调用ajax,参数retext就是后台的返回值

arr = retext.split(",");        //切分字符串
for (var i = 0; i < arr.length; i++) {
var new_li = document.createElement("li");  //新建节点
new_li.innerHTML = arr[i];
add_ul.appendChild(new_li);
}

var lis = add_ul.getElementsByTagName("li"); //为每个添加的节点设置单击事件
for (var i = 0; i < lis.length; i++) {
lis[i].onclick = function () {
text.value = this.innerHTML;
odiv.style.display = "none";
}

}

});
}
</script>

在这里需要注意,因为用户输入很多都是汉字,所以需要使用gb2312字符集,在web.config文件中加入

<system.web>

<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />

</system.web>

③后台代码

在pageload中:

string my_search = Request.QueryString["search"];
SqlConnection con = new SqlConnection();
con.ConnectionString = "data source=.\\sqlexpress; initial catalog=ff; user id=sa;password=123";//连接字符串

//第一种方式
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select top 7 [theme] from table1 where theme like '%"+my_search+"%'"; //最多显示七条数据
cmd.Connection = con;
SqlDataAdapter ada = new SqlDataAdapter();
ada.SelectCommand = cmd;
DataSet set=new DataSet();
ada.Fill(set,"theme");

StringBuilder str=new StringBuilder();
for (int i = 0; i < set.Tables[0].Rows.Count; i++)  //遍历表并给字符串赋值
{
str.Append("," + set.Tables[0].Rows[i].ItemArray[0].ToString());

}
if (str.Length > 1)  //删除字符串首部的逗号
{
str.Remove(0, 1);
}
Response.Write(str.ToString());

//第二种方式
//使用sql存储过程
//SqlCommand cmd = new SqlCommand();
//cmd.CommandType = CommandType.StoredProcedure;
//cmd.CommandText = "search";
//cmd.Parameters.Add("@vin",SqlDbType.VarChar,100,"theme");
//cmd.Parameters[0].Value = my_search;
//cmd.Connection = con;
//SqlDataAdapter ada = new SqlDataAdapter();
//ada.SelectCommand = cmd;
//DataSet set = new DataSet();
//ada.Fill(set, "theme");

//string str_response = set.Tables[0].Rows[0].ItemArray[0].ToString();

//Response.Write(str_response);

Response.End();
}
}
/*

存储过程 search:

ALTER PROCEDURE dbo.search
(@vin varchar(100)
)

AS
declare @str varchar(700);
set @str=(select top 7 [theme]   from forum where theme like '%'+@vin+'%' for xml path(''));
set @str=stuff(replace(replace(@str,'</theme>',''),'<theme>',','),1,1,'')

select @str;
RETURN  ;
*/


因为ajax传参之后,要想获取后台返回值,必须控制后台respon.write输出内容的格式,所以介绍了两种方式:

一种是用C#,另一种是用SQl ,原理都差不多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: