zmosquito 2014-11-21
仿百度搜索,用的基本的js事件和ajax请求,服务器后端返回xml类型,代码比较齐全,基本上可以直接使用。
<style> #auto_div{ position:absolute; border-width:1px; border:1px #808080 solid; } </style>
<input type="text" name="userName" id="auto_txt" value=""/> <div style="border-width:1px; background-color: white;" id="auto_div"></div>
//高亮的索引 var highLightIndex = -1; //超时的标识(对用户连续快速按下键盘的事件做延时处理,只对用户在500ms内最后一次请求,让其生效) var timeoutId; $(document).ready(function(){ init(); $('#auto_txt').bind('keyup',processKeyup); }); /*** * 初始化弹出框列表的位置,大小 */ function init(){ $('#auto_div').hide(); var pos = $('#auto_txt').position(); var topPosition = pos.top+$('#auto_txt').height()+7; var leftPosition = pos.left; $('#auto_div').offset({top:topPosition,left:leftPosition}); $('#auto_div').width(131); } /** * 处理点击鼠标后使div消失 * @param event */ document.onclick = function(event){ var e = event || window.event; var elem = e.srcElement||e.target; while(elem){ if(elem.id == "auto_div"){ return; } elem = elem.parentNode; } //隐藏div的方法 $('#auto_div').hide(); } /** * 处理键盘按下后弹起的事件 * @param event */ function processKeyup(event){ var myEvent = event || windows.event; var keyCode = myEvent.keyCode; //输入是字母,或者退格键则需要重新请求 if((keyCode >= 65 && keyCode <= 90) || keyCode == 32 || (keyCode >= 48 && keyCode <= 57)){ //以下两行代码是为了防止用户快速输入导致频繁请求服务器 //这样便可以在用户300ms内快速输入的情况下,只请求服务器一次 //大大提高服务器性能 highLightIndex = -1; clearTimeout(timeoutId); timeoutId = setTimeout(processAjaxRequest,300); //处理上下键(up,down) }else if(keyCode == 38 || keyCode == 40){ processKeyUpAndDown(keyCode); //按下了回车键 }else if(keyCode == 13){ processEnter(); } } /** * 处理Ajax请求 * @param data */ function processAjaxRequest(){ $.ajax({ type:"post", //http请求方法,默认:"post" url:"${contextPath}/common/ajaxCheckName/"+$('#auto_txt').val(), //发送请求的地址 dataType:"xml", //预期服务器返回的数据类型 success:processAjaxResponse }); } /** * 处理Ajax回复 * @param data Ajax请求得到的返回结果为dom文档对象 */ function processAjaxResponse(data){ $('#auto_div').html('').show(); $('#auto_div').css('z-index','999'); $('#auto_div').css('position','absoulte'); var xml = $(data); var words = xml.find('word'); if(words.length == 0){ $('#auto_div').html('无搜索数据'); } for(var i = 0 ; i < words.length ; i ++){ var word_div = $('<div></div>'); word_div.html(words.eq(i).text()); word_div.hover(fnOver,fnOut); word_div.click(getAutoText); $('#auto_div').append(word_div); } } /** * 处理鼠标滑过 */ function fnOver(){ changeToWhite(); $(this).css('background-color','cyan'); highLightIndex = $(this).index(); //下面一行注释掉了,百度搜索也没这功能,就是鼠标移动时,跟着改变搜索框的内容 //$('#auto_txt').val($('#auto_div').children().eq(highLightIndex).html()); } /** * 处理鼠标移除 */ function fnOut(){ $(this).css('background-color','white'); } /** * 得到自动填充文本 */ function getAutoText(){ //有高亮显示的则选中当前选中当前高亮的文本 if(highLightIndex != -1){ $('#auto_txt').val($(this).html().trim()); $('#auto_div').html('').hide(); } } /** * 处理按下Enter键 * @param keyCode */ function processEnter(){ if(highLightIndex != -1){ $('auto_txt').val($('#auto_div').children().eq(highLightIndex).html().trim()); $('#auto_div').html('').hide(); } } /** * 处理按上下键的情况 */ function processKeyUpAndDown(keyCode){ var words = $('#auto_div').children(); var num = words.length; if(num <= 0) return; changeToWhite(); highLightIndex = ((keyCode != 38 ? num + 1:num - 1)+highLightIndex) % num; words.eq(highLightIndex).css('background-color','cyan'); $('#auto_txt').val(words.eq(highLightIndex).html().trim()); } /** * 如果有高亮的则把高亮变白 */ function changeToWhite(){ if(highLightIndex != -1){ $('#auto_div').children().eq(highLightIndex).css('background-color','white'); } }
后台处理ajax请求的代码,包括List转换为XML
public void ajaxCheckName(@PathVariable String userName, HttpServletResponse response) throws IOException, Exception { List<UserInfo> userInfoList = hrUserInfoService.getUserListByName(userName); List<String> nameList = new ArrayList<String>(); for(UserInfo userInfo : userInfoList){ nameList.add(userInfo.getUserName()); } response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); response.getWriter().write(new StringUtil().list2Xml(nameList)); } /** * * @method list2Xml * @description List转换为XML * * list to xml xml <words><word><key label="key1">value1</key><key * label="key2">value2</key>......</word><word><key * label="key1">value1</key><key * label="key2">value2</key>......</word></words> * * @param list * @return * @throws Exception * @author chengpp * @date 2014-11-20 下午4:57:35 * */ public String list2Xml(List<String> list) throws Exception { Document document = DocumentHelper.createDocument(); Element wordsElement = document.addElement("words"); int i = 0; for (Object o : list) { Element wordElement = wordsElement.addElement("word"); if (o instanceof Map) { for (Object obj : ((Map<?, ?>) o).keySet()) { Element keyElement = wordElement.addElement("key"); keyElement.addAttribute("label", String.valueOf(obj)); keyElement.setText(String.valueOf(((Map<?, ?>) o).get(obj))); } } else { Element keyElement = wordElement.addElement("key"); keyElement.addAttribute("label", String.valueOf(i)); keyElement.setText(String.valueOf(o)); } i++; } return doc2String(document); } /** * * @param document * @return */ public String doc2String(Document document) { String s = ""; try { // 使用输出流来进行转化 ByteArrayOutputStream out = new ByteArrayOutputStream(); // 使用UTF-8编码 OutputFormat format = new OutputFormat(" ", true, "UTF-8"); XMLWriter writer = new XMLWriter(out, format); writer.write(document); s = out.toString("UTF-8"); } catch (Exception ex) { ex.printStackTrace(); } return s; }
根据不同的地区人的喜好,我们可以更好的做出营销,那么不同地区的人进行的搜索词汇也是不一样的,那么如何查看不同地区的人热搜的是什么呢,下面让我介绍一下查看方法。在搜索分类栏有一项为“更多”,点击打开更多