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 相关文章推荐
『jQuery』取指定url格式及分割函数应用
Apr 22 Javascript
关于Javascript加载执行优化的研究报告
Dec 16 Javascript
AngularJS基础学习笔记之简单介绍
May 10 Javascript
jQuery隐藏和显示效果实现
Apr 06 Javascript
js实现移动端轮播图
Dec 21 Javascript
vue+mock.js实现前后端分离
Jul 24 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
Aug 23 Javascript
使用webpack搭建vue环境的教程详解
Dec 31 Javascript
js判断在哪个浏览器打开项目的方法
Jan 21 Javascript
JS对象属性的检测与获取操作实例分析
Mar 17 Javascript
Vue实现点击箭头上下移动效果
Jun 11 Javascript
react的hooks的用法详解
Oct 12 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
php&amp;java(三)
2006/10/09 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
如何编写jquery插件
2017/03/29 jQuery
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
Python yield 使用方法浅析
2017/05/20 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
软件测试常见笔试题
2012/02/04 面试题
初中国旗下的演讲稿
2014/08/28 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
百万英镑观后感
2015/06/09 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js