这篇文章是我转载过来的,我现在做的搜索引擎项目也做了一个基于Jquery做的自动提示功能,这里就不贴了,下面我给出一个我转载的文章分享给大家,喜欢的拿去吧!
智能搜索提示的功能大家都用过,百度搜索的时候一边输入一边会有搜索提示,这样的jQuery做的ajax智能搜索提示很方便,我也决定在我的个人 网站上实现一下。不过我比百度更加提升一步,那就是不仅仅出搜索提示,而是结果不多的直接出搜索结果,当用户鼠标点击或键盘上下键选择以后回车自动到结果 页面而不是搜索结果页面。出来的效果类似下图:
而且还有一个功能,那就是支持空格和第二列重叠搜索,例如以上的示意图,我如果输入“IBM大连”,或者“大连IBM” ,或者“大连 IBM”照样能找到我需要的结果,更加智能,效果见下图:
在线demo地址:请点击此处的google链接,点击第一个结果即可打开。
功能实现思路:首先服务器端需要一个service,当前端keyup事件发生的时候检查关键词,并把匹配的智 能提示结果返回前端。需要注意的是,后端的数据如果是需要从数据库取,那会非常消耗资源,因为并非人多,keyup事件也很多,很可能你的后台就撑不住。 解决思路是从缓存取数据,不要从数据库取,数据库更新数据的时候自动更新缓存,匹配算法优化,提升匹配速度。前端可以输入完keyup一秒你再发送请求道 服务器端,以防止用户接连输入,频繁发送请求。这些都是你可以考虑的。
前端jQuery实现源代码:
$(document).ready(function() { //加onkeyp事件,IE和firefox浏览器兼容的写法:-------------- if(document.addEventListener){ document.addEventListener("keyup",kuhandler, false); }else{ document.attachEvent("onkeyup",kuhandler); } }); //处理keyup事件,注意上下键的处理来选择结果,回车键的处理 //注意特殊按键等不触发智能搜索提示--------------------------------- function kuhandler(event){ if($("#q_qsearch").attr("value")=='') $(".gac_m").remove(); if(event.keyCode==27) $(".gac_m").remove(); else if(event.keyCode==40) { if(menuFocusIndex >= $(".gac_a").length) return true; else { forceMenuItem( menuFocusIndex+1, "#q_qsearch"); givNumber(menuFocusIndex, "#q_qsearch"); } }else if(event.keyCode==38) { if(menuFocusIndex == 1){ forceMenuItem(menuFocusIndex-1, "#q_qsearch"); } else{ forceMenuItem(menuFocusIndex-1, "#q_qsearch"); givNumber(menuFocusIndex,"#q_qsearch"); } } else if(event.keyCode==8){ $(".gac_m").remove();} else if(!event.ctrlKey && (event.keyCode == 32 || (event.keyCode>=48 && event.keyCode<=57) || (event.keyCode>=65 && event.keyCode<=90))) { sug($("#q_qsearch").attr("value"),"wide");} } //从服务器端webservice取得智能搜索提示结果并显示-------------------------------- //getPosition函数取得相对位置,结果框能粘牢搜索框----------------------- function sug(k, wide) { if (k.length<= 1) return; $.get("companyquicksearch.asmx", { f: k }, function(result) { if (result.length > 0) { $(".gac_m").remove(); if ($("#q_qsearch").val().length == k.length) { $("#foot").before(result); var txt = document.getElementById('q_qsearch'); var left_new = getPosition(txt)[1]; var top_new = getPosition(txt)[0]; $(".gac_m").css({ left: left_new + "px", top: (top_new + txt.clientHeight + 2) + "px" }); menuFocusIndex = 0; } } else { $(".gac_m").remove(); } }); } //getPosition函数取得相对位置,结果框能粘牢搜索框----------------------- function getPosition( obj ) { var top = 0,left = 0; do{ top += obj.offsetTop; left += obj.offsetLeft; } while ( obj = obj.offsetParent ); var arr = new Array(); arr[0] = top; arr[1] = left; return arr; } var menuFocusIndex=0; //键盘上下键选择结果的效果,鼠标经过结果的效果----------------------- function forceMenuItem(index, id) { var lastMenuItem = document.getElementById( "menuItem" + menuFocusIndex ) if ( lastMenuItem != null ) { lastMenuItem.bgColor=""; lastMenuItem.childNodes[0].style.color="#000"; lastMenuItem.childNodes[1].style.color="#666"; } var menuItem = document.getElementById( "menuItem" + index ); if ( menuItem == null ) $(id).focus(); else { menuItem.bgColor="#D2EAEC"; menuItem.childNodes[0].style.color="#FFF"; menuItem.childNodes[1].style.color="#333"; menuFocusIndex = index; } } //鼠标经过结果的效果----------------------- function MouseOver(Tr){ $("#"+Tr.id).css("background-color","#D2EAEC"); $("#q_qsearch").val($("#"+Tr.id+" a").text()); $("#rjbtn").attr("role", $("#"+Tr.id+" a").attr("href")); $("#q_qsearch").focus(); } function MouseOut(Tr){ $("#"+Tr.id).css("background-color","#fff");} //选中结果的效果----------------------- function givNumber(index, id) { if(index <= 0) return; var t = document.getElementById( "menuItem" + index ); if(t){ $("#q_qsearch").val($("#menuItem"+index+" a").text()); $("#rjbtn").attr("role", $("#menuItem"+index+" a").attr("href")); $(id).focus(); } }
CSS里面注意一点:table列的固定宽度问题 - 因为我的智能搜索提示是两列的table布局,有时候第一列某些结果很长,我设定了两列的宽度width和table的width但是在IE下没有用,后 来发现table需要加一个css属性:table-layout:fixed;这样设置各个列的宽度有作用了,有时候第一列某些结果很长也会自动 overflow:hidden。
服务端端实现源码: 随便你用啥语言实现一个webservice即可,或者一个动态页面也行啊,很基本的,菜鸟都会的,你就不用问我源码了吧。还不会的话,自己google一下“webservice源码实现”去吧,bless you。