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

代码如下:

<!-- 模拟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,把这里换成你自己的实现就可以了.

(0)

相关推荐

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

    复制代码 代码如下: <!-- 模拟google搜索 --> <script type="text/javascript"> /********************************可配置选项********************************/ // 被选中的相似关键字背景颜色 var selectedBgColor = "#CCCCCC"; // 未被选中的相似关键字背景颜色 var unselectedBgColo

  • google 搜索框添加关键字实现代码

    可以让你向你的用户建议搜索的关键词.要注意: 改变搜索框的代码是违反Google政策的, 但是,这段代码是独立于搜索代码之外的,尽管它确实影响了搜索框的输入. 如下,随便用你希望的搜索关键词代替以下代码中的ABC,DEF和GHI,当用户点击这些关键词的时候,它们就会自动 出现在搜索框中. 复制代码 代码如下: // change forms[0] to forms[n] as needed. <SCRIPT language="JavaScript"> function s

  • android书架效果实现原理与代码

    以前也模仿者ireader实现了书架的效果,但是那种是使用listview实现的,并不好用.绝大多数都是用gridview实现的,网上这方面资料比较少,有些开源的电子书都是重点做了阅读,并没有像ireader和QQ阅读这样的书架效果. 书架这种效果我早就实现了,本来想做一个完美的电子书,但是因为自己的懒惰,仅仅持续了一两天,今天又找到了以前的代码分享出来,希望大家能一起实现一个比较完美的开源的电子书.废话不多说先看下效果:  本地部分还没有做,做好以后就可以吧本地的书加载到书架里了,这只是一个开

  • 密码强度检测效果实现原理与代码

    复制代码 代码如下: <html> <head> <title>密码强度检测效果</title> <script type="text/javascript"> function chkpwd(obj){ var t=obj.value; var id=getResult(t); //定义对应的消息提示 var msg=new Array(4); msg[0]="密码过短."; msg[1]="密

  • Jquery写一个鼠标拖动效果实现原理与代码

    近日项目中要做一个鼠标拖拽层的效果,于是手动使用Jquery做了一个,发出来跟大伙儿分享一下,并希望能得到高手的指点,如果哪位大侠觉得我的思路和代码不正确或者需要改进的话,希望能指点一二,在下感激不尽. 我的思路是这样的: 1.在鼠标按下的时候,捕获鼠标的当前位置: 2.得到要移动对象的当前位置信息: 3.鼠标移动时,计算鼠标移动的距离,将这个距离更新到对象的位置,在我的代码中,我试用绝对定位来表示对象的位置: 4.当鼠标移出对象或者鼠标弹起的时候,则认为对象处于不能移动的状态.这个在我的代码中

  • firefox浏览器下javascript 拖动层效果与原理分析代码

    firefox下实现可拖动层代码 www.jb51.net 拖动层效果代码 var obj=0; var x=0; var y=0; var ie = (navigator.appVersion.indexOf("MSIE")!=-1);//IE var ff = (navigator.userAgent.indexOf("Firefox")!=-1);//Firefox function find(evt,objDiv){ obj = objDiv if (ff)

  • asp+ajax仿google搜索提示效果代码

    对于更完整的代码可以参考,这个是支持数据库的版本.经过我们编辑测试.Asp+Ajax仿google搜索提示效果 数据库版需要修改的地方有 复制代码 代码如下: javascript.js var url="ajax.asp"; //后台地址 var time_delayajax=300; //搜索延迟 var time_delayupdown=100; //方向键延迟 obj_div.style.top = (xtop + 20) + "px"; //20差不多是输

  • JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码

    本文实例讲述了JS实现模拟百度搜索"2012世界末日"网页地震撕裂效果代码.分享给大家供大家参考,具体如下: 这是一款JS模拟百度搜索"2012世界末日"网页地震撕裂效果,本效果是模仿用户在百度输入"2012世界末日"后点击搜索后出来的网页效果,网页在震动,像是地震了,而后开始撕裂,然后显示出相关的文字说明,很酷的效果,希望大家可以学习借鉴. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-

  • Ajax实现模拟关键字智能匹配搜索效果

    准备数据keyword.json:(这里只贴出部分数据) [ {"id":1,"initial":"ad","keyword":"奥迪"}, {"id":2,"initial":"ada4l","keyword":"奥迪A4L"}, {"id":3,"initial":

  • Zend Framework框架实现类似Google搜索分页效果

    本文实例讲述了Zend Framework框架实现类似Google搜索分页效果.分享给大家供大家参考,具体如下: /** * * @param unknown_type $model 表类型 * @param unknown_type $ncontroller 那个控制器提交的controller * @param unknown_type $naction 那个action提交的action */ public function fenyepage2($model,$ncontroller,$

随机推荐