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 相关文章推荐
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
Mar 01 Javascript
jquery的Theme和Theme Switcher使用小结
Sep 08 Javascript
jQuery(非HTML5)可编辑表格实现代码
Dec 11 Javascript
利用进制转换压缩数字函数分享
Jan 02 Javascript
学习使用bootstrap基本控件(table、form、button)
Apr 12 Javascript
微信小程序链接传参并跳转新页面
Nov 29 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
Dec 14 Javascript
web打印小结
Jan 11 Javascript
React组件的三种写法总结
Jan 12 Javascript
用React实现一个完整的TodoList的示例代码
Oct 30 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
Feb 08 Javascript
解决layui表格内文本超出隐藏的问题
Sep 12 Javascript
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封装curl的调用接口及常用函数详解
2018/05/31 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
js选择器全面解析
2016/06/27 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
Python批量修改文件后缀的方法
2014/01/26 Python
python直接访问私有属性的简单方法
2016/07/25 Python
Python面向对象之继承代码详解
2018/01/29 Python
python3转换code128条形码的方法
2019/04/17 Python
Python对列表的操作知识点详解
2019/08/20 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
python中turtle库的简单使用教程
2020/11/11 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
员工安全责任书范本
2014/07/24 职场文书
见习报告的格式
2014/10/31 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
2014年派出所工作总结
2014/11/21 职场文书
民事调解书范文
2015/05/20 职场文书