用AJAX實作google輸入自動完成的簡單模拟 2009-03-02 13:00
比較簡單的模拟,文本框輸入CompanyName,然後 搜尋SqlServer2000 裡NorthWind資料庫 Suppliers表的CompanyName字段, 然後實作自動完成 四個檔案 1 .AutoComplete.htm <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>輸入自動完成</title> <script language="javascript"> //輸入資訊的文本框 var txtInput; //下拉表目前選中項的索引 var currentIndex = -1; //初始化參數,和下拉表位置 function initPar() { txtInput = document.getElementById("txtCompanyName"); //設定下拉表相對于 文本輸入框的位置 setPosition(); } //設定下拉表相對于 文本輸入框的位置 function setPosition() { var width = txtInput.offsetWidth; var left = getLength("offsetLeft"); var top = getLength("offsetTop") + txtInput.offsetHeight; divContent.style.left = left + "px"; divContent.style.top = top + "px"; divContent.style.width = width + "px"; } //擷取對應屬性的長度 function getLength(attr) { var offset = 0; var item = txtInput; while (item) { offset += item[attr]; item = item.offsetParent; } return offset; } //自動完成 function autoComplete() { //如果按下向上, 向下 或 回車 if (event.keyCode == 38 || event.keyCode == 40 || event.keyCode == 13) { //選擇目前項 selItemByKey(); } else //向伺服器發送請求 { //如果值為空 if (txtInput.value == "") { divContent.style.display='none'; return; } //恢複下拉選擇項為 -1 currentIndex = -1; //開始請求 requestObj = new ActiveXObject("Microsoft.XMLHTTP"); requestObj.onreadystatechange = displayResult; requestObj.open("POST", "AutoComplete.aspx?ts=" + new Date().toLocaleString(), true); requestObj.send(txtInput.value); } } //顯示結果 function displayResult() { if (requestObj.readyState == 4) { showData(); divContent.style.display = ""; } } //顯示伺服器傳回的結果 ,并形成下拉表 function showData() { //擷取資料 var doc = new ActiveXObject("MSXML2.DOMDocument.3.0"); doc.loadXML(requestObj.responseText); //顯示資料的xslt var docStyle = new ActiveXObject("MSXML2.FreeThreadedDOMDocument"); docStyle.async = false; docStyle.load("list.xslt"); var docTemplate = new ActiveXObject("MSXML2.XSLTemplate"); docTemplate.stylesheet = docStyle; //通過xslt轉換xml資料 var processor = docTemplate.createProcessor(); processor.input = doc; processor.transform(); var res = processor.output; //顯示轉後後的結果 divContent.innerHTML = res; } //通過鍵盤選擇下拉項 function selItemByKey() { //下拉表 var tbl = document.getElementById("tblContent"); if (!tbl) { return; } //下拉表的項數 var maxRow = tbl.rows.length; //向上 if (event.keyCode == 38 && currentIndex > 0) { currentIndex--; } //向下 else if (event.keyCode == 40 && currentIndex < maxRow-1) { currentIndex++; } //回車 else if (event.keyCode == 13) { selValue(); return; } clearColor(); txtInput.value = tbl.rows[currentIndex].innerText; //設定目前項背景顔色為blue 标記選中 tbl.rows[currentIndex].style.backgroundColor = "InfoBackground"; } //清除下拉項的背景顔色 function clearColor() { var tbl = document.getElementById("tblContent"); for (var i = 0; i < tbl.rows.length; i++) { tbl.rows[i].style.backgroundColor = ""; } } //選擇下拉表中目前項的值 ,用于按回車或滑鼠單擊選中目前項的值 function selValue() { if (event.keyCode != 13) { var text = event.srcElement.innerText; txtInput.value = text; } initList(); } //文本框失去焦點時設定下拉表可見性 function setDisplay() { //擷取目前活動td的表格 if (document.activeElement.tagName == "TD") { var tbl = document.activeElement.parentElement.parentElement.parentElement; //如果不是下拉表,則隐藏下拉表 if (tbl.id != "tblContent") { initList(); } return; } initList(); } function initList() { divContent.style.display='none'; divContent.innerHTML = ""; currentIndex = -1; } </script> </head> <body οnlοad="initPar()"> CompanyName<input type="text" id="txtCompanyName" οnkeyup="autoComplete()" οnblur="setDisplay();" style="width:400px"/> <!-- 顯示下拉表的div--> <div id="divContent" style="display:none; position:absolute; "> </div> </body> </html> |
AutoComplete.aspx
<%@ Page Language="C#" CodeBehind="AutoComplete.aspx.cs" Inherits="AJAXBaseHome.AutoComplete" %>
AutoComplete.aspx.cs
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Configuration;
namespace AJAXBaseHome
{
public partial class AutoComplete : System.Web.UI.Page
{
private static string conString = WebConfigurationManager.ConnectionStrings["myData"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
string input = GetInput();
Response.Write(GetCompanyName(input));
}
//擷取輸入的字元串
private string GetInput()
{
Stream s = Request.InputStream;
int count = 0;
byte[] buffer = new byte[1024];
StringBuilder builder = new StringBuilder();
while ((count = s.Read(buffer, 0, 1024)) > 0)
{
builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
}
return builder.ToString();
}
private string GetCompanyName(string input)
{
using (SqlConnection con = new SqlConnection(conString))
{
SqlCommand command = new SqlCommand("select * from suppliers where CompanyName like @Name", con);
command.Parameters.Add(new SqlParameter("@name", input + "%"));
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds.GetXml();
}
}
}
}
xslt檔案 用于顯示xml資料
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="NewDataSet">
<table id="tblContent" style="background-color:GrayText">
<xsl:for-each select="Table">
<tr>
<!--td中單擊時選擇目前值, 滑鼠在上時更改行背景顔色,滑鼠離開後清除背景顔色-->
<td onclick="selValue()" style="cursor:hand" onmouseover="clearColor();this.parentElement.style.backgroundColor='InfoBackground'" onmouseout="clearColor()">
<xsl:value-of select="CompanyName"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>