`
sudalyl
  • 浏览: 100485 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

仿百度,谷歌输入框自动提示功能

阅读更多

大家使用百度谷歌的时候都会有输入自动提示的功能,心血来潮自己用Ajax模拟了一个,和大家分享分享。

 

 

下面让我们先看下效果:

 

输入自动提示


 

键盘上下移动选取


鼠标选取同样支持
 

 

支持中文匹配
 

 

JSP前台:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>文本自动提示补全功能</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<link rel="stylesheet" type="text/css"
			href="<%=basePath%>css/styles.css">
		<script type="text/javascript" language="javascript" charset="gb2312"
			src="<%=basePath%>js/jquery.js">
</script>
		<script type="text/javascript" language="javascript" charset="gb2312"
			src="<%=basePath%>js/autopromot.js">
</script>
	</head>

	<body>
		自动提示:
		<!-- autocomplete防止一些浏览器的自动提示完成功能 -->
		<input type="text" name="content" id="content" autocomplete="off" />
		<input type="button" id="button" name="button" value="提交" onclick="" />
		<div id="auto">

		</div>
		<br />
		<p>
			药家鑫案死者丈夫称坚持死刑并非全为以命抵命
		</p>

	</body>
</html>

 

核心AJAX:

 

//高亮索引
var highlightindex=-1;

//设置文本框的内容
function setContent(con,index){
	var context=con.eq(index).text();
	$("#content").val(context);
}

//设置背景颜色
function setBkColor(con,index,color){
	con.eq(index).css("background-color",color);
}

$(document).ready(
	function(){
		//获得输入框节点
		var inputItem=$("#content");
		var inputOffset=inputItem.offset();
		var autonode=$("#auto");
		//设置提示框隐藏
		autonode.hide().css("border","1px black solid").css("position","absolute")
		.css("top",inputOffset.top+inputItem.height()+5+"px")
		.css("left",inputOffset.left+"px").width(inputItem.width()+"px");	

		//当键盘抬起时触发事件执行访问服务器业务
		$("#content").keyup(
			function(event){
				var myevent=event||window.event;
				var mykeyCode=myevent.keyCode;
				//字母,退格,删除,空格
				if(mykeyCode>=65&&mykeyCode<=90||mykeyCode==8||mykeyCode==46||mykeyCode==32){
					//清除上一次的内容
					autonode.html(" ");
					//获得文本框内容
					var word=$("#content").val();
					var timeDelay;
					if(word!=""){
						//取消上次提交
						window.clearTimeout(timeDelay);
						//延迟提交,这边设置的为400ms
						timeDelay=window.setTimeout(
							//将文本框的内容发到服务器
							$.post("Autocomplete",{wordtext:encodeURI(word)},
								function(data){
								//将返回数据转换为JQuery对象
								var jqObj=$(data);
								//找到所有的word节点
								var wordNodes=jqObj.find("word");
								wordNodes.each(
									function(i){
										//获得返回的单词内容
										var wordNode=$(this);
										var newNode=$("<div>").html(wordNode.text()).attr("id",i).addClass("pro");
										//将返回内容附加到页面
										newNode.appendTo(autonode);
										//处理鼠标事件
										var con=$("#auto").children("div");
										//鼠标经过
										newNode.mouseover(
											function(){
												if(highlightindex!=-1){
													setBkColor(con,highlightindex,"white");
												}
												highlightindex=$(this).attr("id");
												$(this).css("background-color","#ADD8E6");
												setContent(con,highlightindex);
											}	
										);
										//鼠标离开
										newNode.mouseout(
											function(){
												$(this).css("background-color","white");
											}	
										);
										//鼠标点击
										newNode.click(
											function(){
												setContent(con,highlightindex);
												highlightindex=-1;
												autonode.hide();
											}
										);
									}	
								);    //each

								//当返回的数据长度大于0才显示
								if(wordNodes.length>0){
									autonode.show();
								}else{
									autonode.hide();
								}
							}
							,"xml")    //post
							,400);    //settimeout
					}else{
						autonode.hide();
						highlightindex=-1;
					}
				}else{
					//获得返回框中的值
					var rvalue=$("#auto").children("div");
					//上下键
					if(mykeyCode==38||mykeyCode==40){
						//向上
						if(mykeyCode==38){
							if(highlightindex!=-1){
								setBkColor(rvalue,highlightindex,"white");
								highlightindex--;
							}
							if(highlightindex==-1){
								setBkColor(rvalue,highlightindex,"white");
								highlightindex=rvalue.length-1;
							}
							setBkColor(rvalue,highlightindex,"#ADD8E6");
							setContent(rvalue,highlightindex);
						}
						//向下
						if(mykeyCode==40){
							if(highlightindex!=rvalue.length){
								setBkColor(rvalue,highlightindex,"white");
								highlightindex++;
							}
							if(highlightindex==rvalue.length){
								setBkColor(rvalue,highlightindex,"white");
								highlightindex=0;
							}
							setBkColor(rvalue,highlightindex,"#ADD8E6");
							setContent(rvalue,highlightindex);
						}
					}
					//回车键
					if(mykeyCode==13){
						if(highlightindex!=-1){
							setContent(rvalue,highlightindex);
							highlightindex=-1;
							autonode.hide();
						}else{
							alert($("#content").val());
						}
					}
				}
			}
		);//键盘抬起

		//当文本框失去焦点时的做法
		inputItem.focusout(
			function(){
				//隐藏提示框
				autonode.hide();
			}	
		);
	}
);//reday

 

后台Servlet:

 

/**
 * @author :LYL
 *@date:2011-4-21,下午11:15:29
 */
package com.lyl.service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class Autocomplete extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		response.setContentType("text/xml");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		String path = request.getContextPath();
		String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
		String userword=URLDecoder.decode(request.getParameter("wordtext"),"utf-8");
		String datas=getXml(userword,basePath);
		out.println(datas);
		out.flush();
		out.close();
	}

	/**
	 * 获得匹配的字母,返回List类型
	 * @return
	 */
	private static List<String> getResultList(String userword,String path){
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		List<String> resultlist=new ArrayList<String>();
		try {
			DocumentBuilder db=dbf.newDocumentBuilder();
			Document document=db.parse(path+"/Words.xml");
			NodeList words=document.getElementsByTagName("word");
			int length=words.getLength();
			for(int i=0;i<length;i++){
				Node node=words.item(i);
				//获得字母
				String result=node.getFirstChild().getNodeValue();
				//这边进行一些逻辑处理,字符串的匹配,(后续工作)
				if(result.contains(userword)){
					resultlist.add(result);
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return resultlist;
	}

	/**
	 * 返回结果的XML字符串
	 * @return
	 */
	private static String getXml(String userword,String path){
		List<String> list=getResultList(userword,path);
		Iterator<String> iterator=list.iterator();
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		DocumentBuilder db=null;
		Document document=null;
		try {
			db=dbf.newDocumentBuilder();
			document=db.newDocument();
			//创建根节点
			Element root=document.createElement("words");
			//根节点添加到dom树上
			document.appendChild(root);
			while(iterator.hasNext()){
				String content=iterator.next();
				//创建文本节点
				Text word=document.createTextNode(content);
				//创建word节点
				Element child=document.createElement("word");
				child.appendChild(word);
				root.appendChild(child);
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		return doc2Xml(document);
	}

	private static String doc2Xml(Document document){
		//创建一个DOM转换器
		TransformerFactory  transformerFactory  =  TransformerFactory.newInstance();
		ByteArrayOutputStream  outputStream=null;
		try {
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312");
			transformer.setOutputProperty(OutputKeys.INDENT,"yes");
			outputStream  =  new  ByteArrayOutputStream();
			transformer.transform(new DOMSource(document), new StreamResult(outputStream));
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
		return outputStream.toString();
	}
	
}

 

CSS:

 

@CHARSET "UTF-8";

* {
	font-size: 18px;
}


#content {
	width: 300px;
	height: 30px;
	padding: 0px auto;
}

#button {
	width: 100px;
	height: 30px;
}

.pro {
	cursor: default;
}

#auto {
	background-color: white;
}
 

 

 

好了,大家有什么建议或疑问可以留言哦。

 

源码见附件。

  • 大小: 19.8 KB
  • 大小: 22 KB
  • 大小: 21.6 KB
  • 大小: 18.7 KB
5
3
分享到:
评论
15 楼 jakenlian 2014-04-02  
newNode.click(
[align=left]  function(){
setContent(con,highlightindex); 
highlightindex=-1; 
autonode.hide(); 

);

inputItem.focusout( 
function(){ 
//隐藏提示框 
autonode.hide(); 
}    
);


这两段代码有冲突 点击是自动就是去焦点 所以前者不会执行
14 楼 wrnmb 2011-09-18  
你好,能不通过xml么,我想直接从数据库里面查结果。
13 楼 sudalyl 2011-04-27  
这个只是一个模仿其框架,至于后台匹配就涉及到算法问题,目前没有考虑,如果有空会添加上,呵呵。
12 楼 yy232 2011-04-27  
我还以为输入字母能识别中文呢,失望啊
11 楼 sudalyl 2011-04-25  
hastune 写道
sudalyl 写道
hastune 写道
以前写过一个。但是auto层是用的table。
获取的是一个商品的数据,完成自动填写的功能吧、
js代码没你那么多。:)


呵呵,对的,你写的那个跟这个差不多,是辅助输入功能,我这个主要要涉及到用户的一些操作,比如使用键盘上下移动选取,和使用鼠标选取,所以会多一些代码,如果可以的话可以通过站内信交流,留下联系方式大家平常交流交流。

比如上下键,文本框的内容跟着变,这些都有。:)


额,那我就不知道了,不知仁兄是通过什么原理实现的,可以粘贴下JS我们探讨探讨。
10 楼 hastune 2011-04-25  
sudalyl 写道
hastune 写道
以前写过一个。但是auto层是用的table。
获取的是一个商品的数据,完成自动填写的功能吧、
js代码没你那么多。:)


呵呵,对的,你写的那个跟这个差不多,是辅助输入功能,我这个主要要涉及到用户的一些操作,比如使用键盘上下移动选取,和使用鼠标选取,所以会多一些代码,如果可以的话可以通过站内信交流,留下联系方式大家平常交流交流。

比如上下键,文本框的内容跟着变,这些都有。:)
9 楼 z_xiaofei168 2011-04-25  
sudalyl 写道
z_xiaofei168

你好,你引了jquery.js吗?
还有我的Servlet的引用名是Autocomplete,你在web.xml配置注意一下,还有就是那个Words.xml,格式:
<?xml version="1.0" encoding="UTF-8"?>
<words>
    <word>abandon</word>
    <word>ability</word>
    <word>append</word>
    <word>attention</word>
    <word>administrator</word>
    <word>你好</word>
</words>
放在webroot下。如果没错的话你可以用FireBug调调,或者直接在JS里面加点alert(),看能执行到哪一步。在servlet里面设点断点调调。如果还不行的话,就下载源码吧,我马上放上去。

嗯,好,我再看看,有什么问题再和你交流,呵呵
8 楼 sudalyl 2011-04-24  
z_xiaofei168

你好,你引了jquery.js吗?
还有我的Servlet的引用名是Autocomplete,你在web.xml配置注意一下,还有就是那个Words.xml,格式:
<?xml version="1.0" encoding="UTF-8"?>
<words>
    <word>abandon</word>
    <word>ability</word>
    <word>append</word>
    <word>attention</word>
    <word>administrator</word>
    <word>你好</word>
</words>
放在webroot下。如果没错的话你可以用FireBug调调,或者直接在JS里面加点alert(),看能执行到哪一步。在servlet里面设点断点调调。如果还不行的话,就下载源码吧,我马上放上去。
7 楼 z_xiaofei168 2011-04-24  
sudalyl 写道
z_xiaofei168 写道
你的程序到我这怎么就不能执行出来呢?没反应呀?????????


你好,你可以给我发个站内信我看看你错在哪儿。

错倒是没错,但是在程序运行的时候,没反应,比如:当我在文本框中输入:a的时候,它应该自动出现与a有关的单词之类的。而我的没反应了。
6 楼 sudalyl 2011-04-24  
hastune 写道
以前写过一个。但是auto层是用的table。
获取的是一个商品的数据,完成自动填写的功能吧、
js代码没你那么多。:)


呵呵,对的,你写的那个跟这个差不多,是辅助输入功能,我这个主要要涉及到用户的一些操作,比如使用键盘上下移动选取,和使用鼠标选取,所以会多一些代码,如果可以的话可以通过站内信交流,留下联系方式大家平常交流交流。
5 楼 sudalyl 2011-04-24  
z_xiaofei168 写道
你写的这个我怎么没发现你那个servlet有什么用呀??

Servlet是作为服务器端接受用户端Ajax请求的,没有这个Servlet是无法返回信息的,在JS里面使用的post方法就是请求服务器端返回数据。
4 楼 sudalyl 2011-04-24  
z_xiaofei168 写道
你的程序到我这怎么就不能执行出来呢?没反应呀?????????


你好,你可以给我发个站内信我看看你错在哪儿。
3 楼 z_xiaofei168 2011-04-23  
你的程序到我这怎么就不能执行出来呢?没反应呀?????????
2 楼 z_xiaofei168 2011-04-23  
你写的这个我怎么没发现你那个servlet有什么用呀??
1 楼 hastune 2011-04-23  
以前写过一个。但是auto层是用的table。
获取的是一个商品的数据,完成自动填写的功能吧、
js代码没你那么多。:)

相关推荐

    仿百度,谷歌输入框自动提示功能---JSON版

    仿百度,谷歌输入框自动提示功能---JSON版

    仿谷歌百度实现输入自动补全功能

    实现输入提示,自动补全功能,仿照百度,谷歌样式设计。请大家参考,有bug或者问题给我留言。

    仿百度,谷歌输入框自动提示功能---JSON版,修复上一版的一个BUG

    NULL 博文链接:https://sudalyl.iteye.com/blog/1017877

    javascript仿百度输入框提示自动下拉补全

    本文实例讲解了javascript输入框自动下拉补全操作,仿百度、谷歌搜索框提示,具体内容如下 效果图: 具体代码: &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; &lt;HTML&gt; &lt;HEAD&gt;...

    Ajax 模仿google百度提示输入框 v1.8

    Ajax模仿google提示输入框 使用说明 v1.8 本程序由飞飞asp乐园编写 ************************************************* 特别感谢: 一杯白开水 网友 的帮助 版本所提的修改建议 *********************************...

    Android仿百度谷歌搜索自动提示框AutoCompleteTextView简单应用示例

    本文实例讲述了Android仿百度谷歌搜索自动提示框AutoCompleteTextView简单应用。分享给大家供大家参考,具体如下: 现在我们上网几乎都会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想...

    自动补全提示(可模糊搜索)的输入框

    利用javascript实现类似于百度,谷歌搜索的自动模糊搜索补全提示的功能,代码中已有详细的注释信息,可以实现鼠标点击,上下方向键浏览点击,enter确认等常用功能,可移植性不错。(修订版)

    输入框信息提示的实现(仿google、百度搜索框)(转载)

    本实例实现在输入框信息时自动从数据库中获取相应提示,调试通过IE和火狐(Firefox)。在加载和显示速度上较一般的AJAX提升了很多。 实际原理:监听输入框,当输入框内容发生增减时调用js函数,js函数再去访问另一...

    自动补全(可模糊搜索)的输入框

    利用javascript实现类似于百度,谷歌搜索的自动模糊搜索补全提示的功能,代码中已有详细的注释信息,可以实现鼠标点击,上下方向键浏览点击,enter确认等常用功能,可移植性不错。(修正版)

    成熟的仿百度和goole的搜索联想提示功能

    像百度一样搜索时联想出相关信息 显示在输入框下面

    自动补全提示输入框

    利用javascript实现类似于百度,谷歌搜索的自动模糊搜索补全提示的功能,代码中已有详细的注释信息,可以实现鼠标点击,上下方向键浏览点击,enter确认等常用功能,可移植性不错。

    MFC Combox自动提示输入

    利用 CCombobox 实现百度,google自动匹配,当用户在输入框输入内容时,在下拉框中自动提示与用户输入内容相匹配的项,供用户选择。MFC没有自动提示输入的控件,因此用CComboBox实现,在编程过程中会遇到一些问题,...

    输入自动提示搜索提示功能的[removed]sugggestion.js

    代码如下: /** * 功能:该js文件中的代码实现了[输入自动搜索提示]功能,如百度、google搜索框中输入一些字符会以下拉列表形式给出一些提示,提高了用户体验 * 使用说明:参见suggestions.txt文件 * Author:sunfei(孙飞...

    搜啊SOOUA(asp+accsee) v10.0 共赢版

    输入框增加一键清除按钮可自由设置百度、谷歌、搜狗等联盟帐号COOKEI个性化设置,记录用户选择相关网址导航功能,实用性更强手写、拼音、语音大三在线输入法,解决输入障碍SOOUA V9.0 bulid2014.08.13 更新日志:1、...

    PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能

    本文将介绍如何实现用户输入自动提示的功能,就像谷歌百度搜索引擎一样,当用户输入关键字时,输入框下方会有提示,将与关键字相关的信息展现出来供用户选择,提升了用户体验。 本文将使用jquery ui的autocomplete...

    JavaScript 文本框下拉提示(自动提示)

    JavaScript 文本框下拉提示,类似百度和Google的输入框提示效果,这里为了演示时加载的速度比较快,选用了一些数据,输入“1”可更好的看到效果。

    基于Android中的 AutoCompleteTextView实现自动填充

    现在我们上网会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android 是通过Android 的AutoCompleteTextView Widget 搭配ArrayAdapter 设计同类似Google 搜索...

    搜啊搜索SOOUA(PHP MYSQL) v10.0 正式版.rar

    仿百度界面设计,页面美观大方、实用性超强 超强的关键字提示功能,可根据不同分类给出不同的关键字提示。 输入框增加一键清除按钮 可自由设置百度、谷歌、搜狗等联盟帐号 COOKEI个性化设置,记录用户选择 相关...

Global site tag (gtag.js) - Google Analytics