DWR实现模拟Google搜索效果实现原理及代码


Posted in Javascript onJanuary 30, 2013
<!-- 模拟google搜索 --> 
<script type="text/javascript"> 
/********************************可配置选项********************************/ 
// 被选中的相似关键字背景颜色 
var selectedBgColor = "#CCCCCC"; 
// 未被选中的相似关键字背景颜色 
var unselectedBgColor = "#FFFFFF"; 
// 相似关键字列表框的边框 
var listBorder = "1 solid #000000"; 
/***************************************************************************/ 
/********************************不可配置选项********************************/ 
// 上一次输入的关键字(用来判断关键字是否有改变,没有则不再去服务端重新获取提示关键字) 
var oldKeyValue; 
// 鼠标相对于提示关键字列表框的位置(0:提示框外面,1:提示框里面) 
var mouseLocation = 0; 
// 当前选中的提示关键字索引(从0开始,等于-1表示没有被选中项) 
var selectedKeyIndex = -1; 
// 上一次选中的提示关键字索引(从0开始,等于-1表示没有上次被选中项) 
var oldSelectedKeyIndex = -1; 
// 提示关键字总数 
var tdCount = 0; 
/***************************************************************************/ 
/* 
用途:给String对象添加去除左右空格方法 
*/ 
String.prototype.trim = function() { 
var m = this.match(/^\s*(\S+(\s+\S+)*)\s*$/); 
return (m == null) ? "" : m[1]; 
} 
/* 
用途:初始化提示关键字列表框的状态 
*/ 
function initKeyListState(){ 
selectedKeyIndex = -1; 
oldSelectedKeyIndex = -1; 
tdCount = 0; 
} 
/* 
用途:将上一次选中的关键字项变为未选中 
*/ 
function disSelectedOldKey(){ 
//判断说明:oldSelectedKeyIndex!=selectedKeyIndex 
// 当只有一个相似关键字的时候,则不存在上一次选中和这次选中关键字, 
// 只要第一次选中后,按向上或向下箭头都是选中。 
if (oldSelectedKeyIndex!=-1&&oldSelectedKeyIndex!=selectedKeyIndex){ 
$('keyId'+ oldSelectedKeyIndex).bgColor=unselectedBgColor; 
} 
// 上一次选中项更新 
oldSelectedKeyIndex = selectedKeyIndex; 
} 
/* 
用途:当按上下箭头时选中新的提示关键字项,按回车时将选中的提示关键字输入到搜索框。 
*/ 
function setSelectedKey(){ 
// $('keyId0')存在表示有相关提示关键字,不存在则不处理。 
if($('keyId0')){ 
if (event.keyCode==38){ 
//------处理向上事件------ 
if (selectedKeyIndex==-1){ 
selectedKeyIndex = tdCount-1; 
}else{ 
selectedKeyIndex= (selectedKeyIndex+tdCount-1)%tdCount; 
} 
$('keyId'+ selectedKeyIndex).bgColor= selectedBgColor; 
disSelectedOldKey(); 
}else if (event.keyCode==40){ 
//------处理向下事件------ 
if (selectedKeyIndex==-1){ 
selectedKeyIndex = 0; 
}else{ 
selectedKeyIndex = (selectedKeyIndex+1)%tdCount; 
} 
$('keyId'+ selectedKeyIndex).bgColor= selectedBgColor; 
disSelectedOldKey(); 
}else if (event.keyCode==13){ 
//------处理回车事件------ 
$('cond').value=$('keyId'+ selectedKeyIndex).innerText; 
setCursorLast($('cond')); 
// 隐藏提示关键字列表框 
$('dropdownlistDiv').style.display='none'; 
} 
} 
} 
/* 
用途:获取相似关键字 
*/ 
function getConformKey(){ 
//得到输入的关键字 
var keyValue = $('cond').value.trim(); 
// 如果这次的查询关键字和上次的一样,则不去服务器重新获取相似关键字列表。 
if (keyValue!=oldKeyValue){ 
// 关键字为空则不去服务器获取相似关键字列表 
if (keyValue==''){ 
DWRUtil.removeAllRows('showKeyList'); 
setDropListVisible(false); 
initKeyListState(); 
}else{ 
//采用ajax异步模式获取相似关键字(这里的useraction,改成自己的action) 
useraction.findByLike(keyValue,conformKeyCallback); 
} 
} 
} 
/* 
用途:获取关键字回调方法 
*/ 
function conformKeyCallback(keyList){ 
DWRUtil.removeAllRows('showKeyList'); 
initKeyListState(); 
if (keyList.length>0){ 
// 生成相似关键字提示框 
DWRUtil.addRows('showKeyList',keyList,cellFuncs, { 
cellCreator:function(options) { 
var td = document.createElement("td"); 
td.id = 'keyId' + tdCount++; 
td.onmouseover = function (){selectedKeyIndex=parseInt(this.id.substring(5,td.id.length));this.bgColor=selectedBgColor;disSelectedOldKey();}; 
td.onclick= function (){ 
$('cond').value=this.innerText; 
$('cond').focus(); 
setCursorLast($('cond')); 
$('dropdownlistDiv').style.display='none'; 
}; 
return td; 
},escapeHtml:false}); 
setDropListVisible(true); 
}else{ 
setDropListVisible(false); 
} 
} 
/* 
用途:表格数据显示处理方法 
*/ 
var cellFuncs = [ 
function(data) { return data.username; } 
]; 
/* 
用途:将输入框的光标移到最后 
*/ 
function setCursorLast(inputObj){ 
var inputRange = inputObj.createTextRange(); 
inputRange.collapse(true); 
inputRange.moveStart('character',inputObj.value.length); 
inputRange.select(); 
} 
/* 
用途:创建相似关键字列表框 
*/ 
function createShowDiv(){ 
var showDiv = document.createElement("div"); 
showDiv.id = "dropdownlistDiv"; 
with(showDiv.style){ 
position = "absolute"; 
//层的绝对位置从这调整 
left = parseInt($('cond').style.left.replace('px',''))+190; 
top = parseInt($('cond').style.top.replace('px',''))+parseInt($('cond').style.height.replace('px',''))+28; 
width = parseInt($('cond').style.width.replace('px','')); 
border = listBorder; 
zIndex = "1"; 
display='none'; 
backgroundColor = unselectedBgColor; 
} 
showDiv.onmouseover=function (){mouseLocation=1;}; 
showDiv.onmouseout=function (){mouseLocation=0;}; 
//overflow设置滚动条 
showDiv.innerHTML = "<div style='width:100%;height:150px;overflow:auto;'><table border='0' style='width: 100%;height:20%;font-size: 12;color:#33CC00;'><tbody id='showKeyList' style='margin-left: 0;margin-right: 0;margin-bottom: 0;margin-top: 0;'></tbody></table></div>"; 
document.body.appendChild(showDiv); 
initKeyListState(); 
} 
/* 
用途:设置相似关键字列表框是否可见 
参数:isDisplay,true表示可见,false表示不可见 
*/ 
function setDropListVisible(isDisplay){ 
if (mouseLocation == 1){ 
return; 
} 
if (($('cond').value.trim()!='')&&(isDisplay==true)){ 
$('dropdownlistDiv').style.display=''; 
} 
else{ 
$('dropdownlistDiv').style.display='none'; 
} 
} 
// 将创建相似关键字列表框方法附加到onload事件中 
if (window.addEventListener){ 
window.addEventListener('load', createShowDiv, false); 
}else if (window.attachEvent){ 
window.attachEvent('onload', createShowDiv); 
} 
</script>

这个js可以放在你需要实现搜索效果的jsp里,或单独保存为js文件都可以.
<div style="position:absolute;left:190px;top:25px;"> 
<input AUTOCOMPLETE="off" 
onkeydown="oldKeyValue=this.value.trim();setSelectedKey();" 
onkeyup="getConformKey();" 
onfocus="if(this.value=='找人') this.value='';setDropListVisible(true);" 
onblur="setDropListVisible(false);" 
style="width: 300; height: 23;z-index: 10;top:0;left:0;" type="text" name="cond" value="找人" id="cond" /> 
<input type="button" class="btn" value="搜一下" onclick="findBylike();" /> 
</div>

useraction.findByLike(String name);是dao层的一个查询方法,
返回一个List,把这里换成你自己的实现就可以了.
Javascript 相关文章推荐
什么是DOM(Document Object Model)文档对象模型
Mar 05 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
javascript数组去重3种方法的性能测试与比较
Mar 26 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
Jun 25 Javascript
jQuery解析json数据实例分析
Nov 24 Javascript
详解Javascript模板引擎mustache.js
Jan 20 Javascript
jQuery解析json格式数据简单实例
Jan 22 Javascript
jQuery实现日期联动效果实例
Jul 26 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 Javascript
监听element-ui table滚动事件的方法
Mar 26 Javascript
简单实现节流函数和防抖函数过程解析
Oct 08 Javascript
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
E3 tree 1.6在Firefox下显示问题的修复方法
Jan 30 #Javascript
js判断样式className同时增加class或删除class
Jan 30 #Javascript
编写针对IE的JS代码两种编写方法
Jan 30 #Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
Jan 29 #Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
Jan 29 #Javascript
JavaScript起点(严格模式深度了解)
Jan 28 #Javascript
一个页面元素appendchild追加到另一个页面元素的问题
Jan 27 #Javascript
You might like
php在线生成ico文件的代码
2007/10/09 PHP
PHP 错误处理机制
2015/07/06 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
Python 实现简单的电话本功能
2015/08/09 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
英语生日邀请函
2014/01/23 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
公司2014年度工作总结
2014/12/10 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
教师师德工作总结2015
2015/07/22 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
高一英语教学反思
2016/03/03 职场文书
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS