JS 自动完成 AutoComplete(Ajax 查询)


Posted in Javascript onJuly 07, 2009

JS 自动完成 AutoComplete(Ajax 查询)
一:JS 部分

//******************************************************** 
//创建日期: 2009-03-10 
//作 者: oloen 
//?热菟得? 自动完成JS类 
//用法: 
// var auto = new autoComplete(客户端ID); 
// auto.Init(document.all.客户端ID); 
// auto.Type = 'PSUnit' //PSSale 
//******************************************************** 
//自动完成 
function autoComplete(id) 
{ 
var me = this; 
//自动完成绑定控件客户端ID 
me.AutoCompleteControlID 
me.handle = null 
me.DivResult ; 
me.currentIndex = -1; 
me.LastIndex = -1; 
me.requestObj; 
me.CurrentTD = ''; 
me.Filter = '1=1'; 
me.Type = 'PSUnit' 
if(id != null && typeof(id) != undefined) 
me.AutoCompleteControlID = id; 
if(me.DivResult == null||typeof(me.DivResult)=="undefined") 
{ 
me.DivResult = document.createElement("div"); 
var parent = document.getElementById(me.AutoCompleteControlID).parentElement; 
if(typeof(parent)!="undefined"){ 
parent.appendChild(me.DivResult); 
} 
} 
this.Init = function(obj) 
{ 
me.handle = obj 
me.AutoCompleteControlID = obj.id 
} 
this.Auto = function() 
{ 
me.DivResult.style.position = "absolute"; 
me.DivResult.style.top = me.handle.getBoundingClientRect().top - 11; 
me.DivResult.style.left = me.handle.getBoundingClientRect().left; 
me.DivResult.style.width = me.handle.width; 
me.DivResult.style.height = 20; 
me.DivResult.style.backgroundColor = "#ffffff"; 
//如果按下 向上, 向下 或 回车 
if (event.keyCode == 38 || event.keyCode == 40 || event.keyCode == 13) 
{ 
me.SelectItem(); 
} 
else 
{ 
//恢复下拉选择项为 -1 
currentIndex = -1; 
if(window.XMLHttpRequest) 
{ 
me.requestObj = new XMLHttpRequest(); 
if(me.requestObj.overrideMimeType) 
me.requestObj.overrideMimeType("text/xml"); 
} 
else if(window.ActiveXObject) 
{ 
try 
{ 
me.requestObj = new ActiveXObject("Msxml2.XMLHTTP"); 
} 
catch(e) 
{ 
me.requestObj = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
} 
if(me.requestObj == null) 
return; 
me.requestObj.onreadystatechange = me.ShowResult; 
me.requestObj.open("GET", "../Common/AutoComplete.aspx?InputValue=" + escape(me.handle.value) + "&Filter=" + me.Filter + "&Type=" + me.Type, true); 
me.requestObj.send(); 
} 
} 
this.ShowResult = function() 
{ 
if (me.requestObj.readyState == 4) 
{ 
me.DivResult.innerHTML = me.requestObj.responseText; 
me.DivResult.style.display = ""; 
} 
} 
this.SelectItem = function() 
{ 
//结果 
var result = document.getElementById("Tmp_AutoComplete_tblResult"); 
if (!result) 
return; 
if(result.rows[me.LastIndex] != null) 
{ 
result.rows[me.LastIndex].style.backgroundColor = "#FFFFFF"; 
result.rows[me.LastIndex].style.color = "#000000"; 
} 
var maxRow = result.rows.length; 
//向上 
if (event.keyCode == 38 && me.currentIndex > 0) 
me.currentIndex--; 
//向下 
if (event.keyCode == 40 && me.currentIndex < maxRow-1) 
me.currentIndex++; 
//回车 
if (event.keyCode == 13) 
{ 
me.Select() 
me.InitItem(); 
return; 
} 
if(result.rows[me.currentIndex]!=undefined) 
{ 
//选中颜色 
result.rows[me.currentIndex].style.backgroundColor = "#3161CE"; 
result.rows[me.currentIndex].style.color = "#FFFFFF"; 
} 
me.DivResult.style.height = maxRow * 15; 
me.LastIndex = me.currentIndex; 
} 
this.Select = function() 
{ 
var result = document.getElementById("Tmp_AutoComplete_tblResult"); 
if (!result || result.rows.length<=0) 
return; 
//默认第一条记录 
if(me.currentIndex < 0) 
me.currentIndex = 0; 
var ReturnValue = result.rows[me.currentIndex].ReturnValue; 
if(ReturnValue != undefined) 
{ 
me.DivResult.style.display = 'none'; 
//设置页面值 
ReturnAutoComplete(ReturnValue); 
} 
} 
this.Hide = function() 
{ 
me.DivResult.style.display = 'none'; 
me.currentIndex = -1; 
} 
this.InitItem = function() 
{ 
me.DivResult.style.display = 'none'; 
me.DivResult.innerHTML = ""; 
me.currentIndex = -1; 
} 
me.DivResult.onclick = function() 
{ 
try{me.Auto();}catch(e){} 
} 
document.getElementById(me.AutoCompleteControlID).onclick = function(){ 
try{me.Auto();}catch(e){} 
} 
document.getElementById(me.AutoCompleteControlID).onkeyup = function(){ 
try{me.Auto();}catch(e){} 
} 
document.getElementById(me.AutoCompleteControlID).onkeydown = function(){ 
if (event.keyCode == 13) 
{ 
try 
{ 
me.Select() 
me.InitItem(); 
}catch(e){} 
} 
} 
document.getElementById(me.AutoCompleteControlID).onblur = function(){ 
me.Hide(); 
} 
}

2 后台查询页面
using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
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.Data.SqlClient; 
//******************************************************** 
//创建日期: 2009-03-10 
//作 者: Oloen 
//?热菟得? 自动完成后台查询页面 
// Type:pssale 合同查询 
// Type:psunit 房间查询 
//******************************************************** 
/// <summary> 
/// 自动完成后台查询页面 
/// </summary> 
public partial class Common_AutoComplete : System.Web.UI.Page 
{ 
const string tbStyle = @"style=""color:#F7922E"""; 
/// <summary> 
/// 过滤条件 
/// </summary> 
string Filter = string.Empty; 
/// <summary> 
/// 查询值 
/// </summary> 
string InputValue = string.Empty; 
/// <summary> 
/// 自动完成类别 
/// Type:pssale 合同查询 
/// Type:psunit 房间查询 
/// </summary> 
string Type = string.Empty; 
/// <summary> 
/// 返回结果字符 
/// </summary> 
string ReturnStr = string.Empty; 
private void Page_Load(object sender, System.EventArgs e) 
{ 
switch (Type.ToLower()) 
{ 
case "pssale": 
case "psunit": 
default: 
AutoPSUnitNo(); 
break; 
} 
Response.Clear(); 
Response.ContentType = "text/xml"; 
Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"); 
Response.Write(ReturnStr); 
Response.End(); 
} 
protected override void OnInit(EventArgs e) 
{ 
base.OnInit(e); 
Filter = Request.QueryString["Filter"] ?? "1=1"; 
InputValue = Request.QueryString["InputValue"] ?? ""; 
InputValue.Replace("'","''"); 
Type = Request.QueryString["Type"] ?? ""; 
} 
/// <summary> 
/// 售楼系统房间编号自动完成 
/// </summary> 
void AutoPSUnitNo() 
{ 
if (!string.IsNullOrEmpty(InputValue)) 
{ 
ReturnStr = @"<table cellSpacing=""0"" cellPadding=""0"" width=""150px"" align=""center"" border=""0"" id=""Tmp_AutoComplete_tblResult"" style=""padding-left:5;padding-right:5; background-color:#FFFFFF;border:1px solid #999999;"">"; 
string Sql = string.Format(@"SELECT TOP 10 UnitID,UnitNo,ProjectNo,PhaseNo,BlockNo FROM View_PS_Unit WHERE UnitNo LIKE '%{0}%' AND {1}", InputValue, Filter); 
if (Type.ToLower().Equals("pssale")) 
Sql = string.Format(@"SELECT TOP 10 SaleID,UnitID,UnitNo,ContractNo,Name,SaleDate,SellingPrice,ProjectNo FROM View_PS_Sale_Unit WHERE UnitNo LIKE '%{0}%' AND {1}", InputValue, Filter); 
using (SqlDataReader sdr = DataAccessHelper.ExecuteReader(Sql) as SqlDataReader) 
{ 
if (sdr == null || !sdr.HasRows) 
{ 
ReturnStr = string.Empty; 
return; 
} 
while (sdr.Read()) 
{ 
string td = string.Format(@"<td height=""15"" nowrap>{0}</td>", sdr["ProjectNo"].ToString()); 
//td += string.Format(@"<td height=""15"" nowrap>{0}</td>", sdr["PhaseNo"].ToString()); 
//td += string.Format(@"<td height=""15"" nowrap>{0}</td>", sdr["BlockNo"].ToString()); 
td += string.Format(@"<td height=""15"" nowrap align=""right"" {1}>{0}</td>", sdr["UnitNo"].ToString(), tbStyle); 
if (Type.ToLower().Equals("pssale")) 
{ 
ReturnStr += string.Format(@"<tr ReturnValue=""{0},{1},{2},{3},{4},{5},{6}"">{7}</tr>", 
sdr["SaleID"].ToString(), sdr["UnitID"].ToString(), 
sdr["UnitNo"].ToString(), sdr["ContractNo"].ToString(), 
sdr["Name"].ToString(), sdr["SaleDate"].ToString(), 
sdr["SellingPrice"].ToString(), td); 
} 
else 
ReturnStr += string.Format(@"<tr ReturnValue=""{0},{1}"">{2}</tr>", sdr["UnitID"].ToString(), sdr["UnitNo"].ToString(), td); 
} 
} 
ReturnStr += @"</table>"; 
} 
} 
}

3 调用部分
<!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> 
<meta http-equiv="Content-Type" content="text/html; charset=gb-2312" /> 
<script type="text/javascript" src="../JS/AutoComplete.js"></script> 
<title>无标题 1</title> 
</head> 
<body> 
<input id="t1" type="text"> 
<script> 
var auto = new autoComplete('t1') 
auto.Init(document.all.t1); 
//选中后做的事情 
function ReturnAutoComplete(ReturnValue) 
{ 
alert(ReturnValue) 
} 
</script> 
</body> 
</html>
Javascript 相关文章推荐
JSQL SQLProxy 的 php 版本代码
May 05 Javascript
javascript深入理解js闭包
Jul 03 Javascript
ajax不执行success回调而是执行了error回调
Dec 10 Javascript
老生常谈 js中this的指向
Jun 30 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
Mar 07 Javascript
jQuery插件ContextMenu自定义图标
Mar 15 Javascript
详解jquery选择器的原理
Aug 01 jQuery
浅谈vue中数据双向绑定的实现原理
Sep 14 Javascript
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
redux中间件之redux-thunk的具体使用
Apr 17 Javascript
vue最简单的前后端交互示例详解
Oct 11 Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 Javascript
javascript 选择文件夹对话框(web)
Jul 07 #Javascript
JavaScript 解析读取XML文档 实例代码
Jul 07 #Javascript
javascript 新浪背投广告实现代码
Jul 07 #Javascript
JavaScript 对象、函数和继承
Jul 07 #Javascript
js 日期转换成中文格式的函数
Jul 07 #Javascript
javascript 面向对象思想 附源码
Jul 07 #Javascript
jquery BS,dialog控件自适应大小
Jul 06 #Javascript
You might like
JS实现php的伪分页
2008/05/25 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
vue鼠标悬停事件实例详解
2019/04/01 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python requests.post带head和body的实例
2019/01/02 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
用python制作个视频下载器
2021/02/01 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
个人简历自我评价范文
2014/02/04 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
稽核岗位职责
2015/02/10 职场文书
财务稽核岗位职责
2015/04/13 职场文书
新闻通讯稿模板
2015/07/22 职场文书
给校长的建议书范文
2015/09/14 职场文书
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL