65.9K
CodeProject 正在变化。 阅读更多。
Home

类似 Google 的搜索文本框

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.92/5 (20投票s)

2009年8月10日

CPOL

3分钟阅读

viewsIcon

171329

downloadIcon

8497

类似 Google 的搜索文本框

引言

我们中的许多人都在使用 Google 作为搜索引擎。 我们喜欢 Google 的原因有很多,其中一个原因是 Google 建议可能的搜索结果并使生活更轻松。 这种搜索建议文本框在我们的许多 Web 应用程序中非常有用。 本文将帮助您实现搜索建议文本框。

用户将在搜索文本框中键入一个字符。Onkeyup 事件将被触发。它调用负责处理 AJAX 并接收响应的方法。 此响应将使用 DIV 标签显示。

背景

AJAX 请求将通过使用 JavaScript 的 XMLHttpRequest 对象进行处理。

使用 XMLHttpRequest 对象,Internet Explorer 客户端可以直接检索 XML 数据并将其提交到 Web 服务器,而无需重新加载页面。 要将 XML 数据转换为可呈现的 HTML 内容,请使用客户端 XML DOM 或可扩展样式表语言转换 (XSLT) 来组成用于呈现的 HTML 元素。

Using the Code

本文随附的代码主要包含三个文件

  1. Welcome.aspx
  2. SearchSuggest.js
  3. Result.aspx

让我们详细看看每个页面。

Welcome.aspx

此页面有一个搜索文本框,可在用户在搜索文本框中键入时显示建议的搜索结果。

<script language="JavaScript" type="text/javascript" src="SearchSuggest.js"></script>

上面的代码将导入 SearchSuggest.js 文件,该文件负责异步回发。

 <style type="text/css" media="screen">	
          body 
          {
           font: 11px arial;
           }
	   .suggest_link 
	   {
	   background-color: #FFFFFF;
	   padding: 2px 6px 2px 6px;
	   }	
	   .suggest_link_over
	   {
	   background-color: #3366CC;
	   padding: 2px 6px 2px 6px;	
	   }	
	   #search_suggest 
	   {
	   position: absolute;
	   background-color: #FFFFFF;
	   text-align: left;
	   border: 1px solid #000000;			
	   }
	</style>

上面的 CSS 代码用于显示来自建议结果的已选中/未选中状态

  <input type="text" id="txtSearch" name="txtSearch" alt="Search Criteria"     
	önkeyup="searchSuggest(event);" autocomplete="off" style="width: 544px" /> 
    
<div id=""search_suggest""></div>

    <input type="submit" id="cmdSearch" name="cmdSearch" 
			value="Search" alt="Run Search" />

txtSearch 是搜索的文本框。 SearchSuggest.js 中的方法 searchSuggest(event) 在其 onkeyup 事件上被调用。 我们必须使用 onkeyup 事件,以便在每次输入字符时,搜索建议都应该处理并给出相应的结果。
div search_suggest 是隐藏的。 当找到与输入的字符对应的结果时,它将可见。

搜索提交按钮以搜索结果。 本文的范围仅限于搜索建议。 可以在单击搜索按钮时增强功能。 本文没有搜索按钮的 onclick 的任何代码。

SearchSuggest.js

此文件包含使用 XMLHTTPRequest 对象进行 AJAX 请求的代码。

function getXmlHttpRequestObject() 
{	
    if (window.XMLHttpRequest) 
    {
        return new XMLHttpRequest();	
        //For all the new browsers
    } 
    else if(window.ActiveXObject) 
    {
        //for IE5,IE6
        return new ActiveXObject("Microsoft.XMLHTTP");	
    }
    else
    {
        alert("Time to upgrade your browser?");	
      }
}

getXmlHttpRequestObject 函数将根据浏览器类型返回 XMLHttpRequest 的对象。 对于 Internet Explorer 5、Internet Explorer 6,它从 "Microsoft.XMLHTTP" 创建 ActiveXObject

//Our XmlHttpRequest object to get the auto suggestvar 
searchReq = getXmlHttpRequestObject();

function searchSuggest(e) 
{
var key = window.event ? e.keyCode : e.which;

if (key==40 || key==38)
{
scrolldiv(key); 
}
else
{
if (searchReq.readyState == 4 || searchReq.readyState == 0) 
{
var str = escape(document.getElementById('txtSearch').value);
strOriginal=str;
searchReq.open("GET", 'Result.aspx?search=' + str, true);		
searchReq.onreadystatechange = handleSearchSuggest;
searchReq.send(null);	
}
} 	
}

函数 searchSuggest 将接受发送到 Result.aspx 的请求并从中获取响应。 在请求时,它将搜索文本框中输入的字符作为 querystring 发送。 根据搜索条件,result.aspx 将进行处理并将结果发送回去。 result.aspx 将以 string 格式发送回复。 搜索结果用“~”连接,这将由 handleSearchSuggest 方法处理,并为每个结果创建 Div 标签。

Result.aspx.cs

Result.aspx 的目的是处理 Ajax 请求,因此它在 HTML 中没有任何代码。 它只有一个 aspx 页面。
在后台代码文件中,它验证查询字符串,获取搜索字符串并将其处理到数据库。 然后以字符串格式返回结果。 生成的字符串用“~”连接。

private void Getresult()
    {
        DataTable dt = new DataTable();
       
         SqlConnection con = new SqlConnection
	("Data Source=Local;Initial Catalog=Rahul;User ID=sa;Password=sa");
         
        SqlCommand cmd=new SqlCommand();
        cmd.Connection=con;
        cmd.CommandType= CommandType.StoredProcedure;
        
        cmd.CommandText="SFund";

        //SFund is Stored Procedure Name which accepts 
        //parameter as @Client_Name and gives the search Result
        
        SqlParameter parClientName = new SqlParameter("@Client_Name", SqlDbType.VarChar);
        parClientName.Value = clientName;
        cmd.Parameters.Add(parClientName);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
        StringBuilder sb = new StringBuilder(); 
       
        if (dt.Rows.Count > 0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            { 
                sb.Append(dt.Rows[i].ItemArray[0].ToString()  + "~");   
            }
        }

           Response.Write(sb.ToString());   

    }

请求

这是我发布在 The Code Project 上的第一篇文章。 您可以从本文顶部的链接下载代码。

© . All rights reserved.