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

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

阅读更多

上个文章已经实现自动提示的功能,但是看过的童鞋们都知道我的交互使用XML做的,XML的传输是十分耗带宽的,用于我们这些做着玩的还可以,但是一旦数据量大起来他就相当的不给力了,所以我想使用JSON格式的数据传输,这样应该会好很多,说实话,之前知道有JSON,但是没学过啊,所以只好先学学JSON,至于JSON如何用我就不介绍了,大家网上搜搜到处都是,如果有什么搜不到的可以给我留言,虽然我不精通,但是基本使用还是能够应付的。

 

好了,言归正传,说说我们这次的主题,这次修复的BUG是什么呢?有童鞋发现了吗?,好吧,没发现也没关系,因为我自己也是这次才发现。那就是setTimeout()的问题,大家在服务器端加个打印输出一下,我们会发现时延并没有起到效果。好了,这次我就不上源码了,也不上图了,直接上修复过的代码,和使用JSON的部分。注意哦,要加上json.js,和一个JSON包,这个我打包给大家上传。

 

JS:

 

//高亮索引
var highlightindex=-1;
var timeDelay;
//设置文本框的内容
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();
					if(word!=""){
						function mydeal(){
							//将文本框的内容发到服务器
							$.post("Autocomplete",{wordtext:encodeURI(word)},
								function(data){
								var wordNodes=data;
								$.each(data,
									function(i){
									//拼接返回数据
									var newNode=$("<div>").html(data[i]).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();
								}
							}
							,"json");//post
						}
						//取消上次提交
						clearTimeout(timeDelay);
						//延迟提交,这边设置的为200ms
						timeDelay=setTimeout(
							mydeal,200);    //settimeout
					}else{
						autonode.hide();
						highlightindex=-1;
					}
				}else{
					//alert();
					//获得返回框中的值
					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.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.util.ArrayList;
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 net.sf.json.JSONArray;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Autocomplete extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		response.setContentType("text/html");
		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");
		List<String> results=getResultList(userword, basePath);
		JSONArray ja=JSONArray.fromObject(results);
		out.println(ja.toString());
		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;
	}

}
 

效果同样实现,大家可以修改试试,要引的包大家在下面下载:

 

1
5
分享到:
评论
2 楼 long5295 2013-10-29  
你说的上个文章,能给个链接吗?
1 楼 潘清山 2012-05-02  
小弟:jquery不是很懂
哪个在输入框的视图在哪呢??

相关推荐

    Android爬坑之旅:软键盘挡住输入框问题的终极解决方案.docx

    为了解决这个问题,开发者可以使用 AndroidBug5497Workaround 类,这个类可以使得软键盘不挡住输入框,并且可以在多个 Android 版本上使用。使用这个类非常简单,只需要将其复制到项目中,并在需要的 activity 的 ...

    cpp-Adaptagtktheme一个基于MaterialDesign计指南的自适应Gtk主题

    无论是修复bug、添加新功能还是改进现有设计,都能通过GitHub上的adapta-project/adapta-gtk-theme仓库进行贡献。最新版本e517226包含了项目的最新改进和修复。 总之,Adapta-gtk-theme为Linux用户带来了Material ...

    chromedriver-win64_124.0.6346.0.zip

    此外,由于每个新版本的Chromedriver都会修复一些bug和增加新的功能,所以定期更新Chromedriver也是必要的。 总之,Chromedriver-win64_124.0.6346.0.zip这个压缩包是自动化测试中不可或缺的一部分,它使得开发者...

    Firefox火狐浏览器官方2.0 RC 1-win32版本exe安装包

    "RC"代表"Release Candidate",意味着这个版本是最终正式版发布前的最后一个测试版本,通常在修复大量bug和优化性能后推出,以确保软件稳定性。 Firefox 2.0的改进与特性: 1. **Tabbed Browsing(标签浏览)**:...

    material-dashboard-pro-react-v1.0.0

    "CHANGELOG.md"文件记录了项目的版本更新历史,包括每次升级引入的新功能、修复的bug以及任何重大变更。这有助于开发者跟踪项目的演化,并决定是否需要更新到新版本。 "public"目录通常包含应用的静态资源,如HTML...

    baidu_appwidget

    6. **更新与维护**:作为一款模仿和创新的作品,"baidu_appwidget"可能会持续迭代更新,以修复潜在的bug,增加新功能,保持与百度官方应用的兼容性。 【标签】"百度"表明这款小部件专注于提供百度搜索服务;"搜索...

    谷歌拼音输入法

    在3.0.1.98版本中,谷歌可能进行了性能优化和bug修复,提升了输入的稳定性和用户体验。而2.7.25.128作为官方最后的正式版,可能是一些用户钟爱的老版本,因为某些用户可能对新版本的某些变化不适应,或者认为旧版本...

    谷歌音乐搜索栏的提示功能php修正代码

    文档首先提到,谷歌音乐的搜索栏提示功能是一个很受欢迎的特性,它能够在用户输入搜索词时提供自动补全建议,提高用户搜索效率。然而,这一功能存在一个小bug。具体来说,当用户在页面加载时快速定位到搜索栏并输入...

    gwt-windows-1.4.6.1

    GWT(Google Web Toolkit)是Google开发的一个开源工具包,用于构建高性能、跨浏览器的JavaScript应用程序。这个框架允许开发者使用Java语言编写客户端代码,然后通过编译器将其自动转换为优化过的JavaScript,使得...

    TearSnow Fan

    ② 关于内置的图片暗箱效果的使用,添加图片后,需要把图片链接到原图片,即在img标签再外套一个a标签方能实现图片暗箱(简单点就是图片或文章的链接是一张图片的地址,点击便自动使用暗香功能,本文介绍前面的文字...

    mobyfactory-uiwidgets-android

    8. **版本控制**:MobyFactory可能会发布不同的版本,每个版本可能包含新功能、bug修复或性能改进,开发者需要关注版本更新以获取最新的改进。 9. **社区支持**:开源项目通常有社区支持,开发者可以在社区论坛或...

    angularjs版todolist

    在IT领域,前端开发是不可或缺的一部分,而AngularJS作为一款由Google维护的JavaScript框架,被广泛应用于构建动态Web应用。本项目是一个基于AngularJS 1.4版本实现的TodoList,旨在帮助用户管理日常任务,同时也为...

    电脑软件电脑翻译QTranslate6.5.3.rar

    版本6.5.3是该软件的一个更新版本,通常会包含性能优化、错误修复以及可能的新功能。 QTranslate的核心特点在于其便捷性,用户只需选中待翻译的文本,按下热键(通常是Ctrl+Q),即可快速弹出翻译窗口,显示翻译...

    material-pro.Version 4.4.zip.7z

    通常,版本号的升级意味着新功能的添加、性能的优化、bug的修复以及对设计趋势的跟进。这个版本可能包含改进的组件、新的主题选项或者对不同设备和平台的支持。 在标签中,“MaterialPro”和“Version 4.4”被再次...

    MDUI前端框架 v1.0.2.zip

    v1.0.2是该框架的一个版本更新,提供了更多的功能优化和bug修复,以确保更稳定和流畅的用户体验。 在"MDUI前端框架 v1.0.2.zip"这个压缩包中,包含了两个主要的文件: 1. **说明.htm**:这是一个HTML文档,通常...

    实现自定义的新浪微博

    8. **异常处理与错误报告**:为了提高应用稳定性,我们需要处理可能出现的异常,提供友好的错误提示,并可能通过日志或Crashlytics等工具收集错误信息,以便及时发现和修复bug。 9. **测试与调试**:应用开发过程中...

    Dashboard & Search Bookmarks-crx插件

    Chrome壁纸自定义 - 壁纸图像可以随机更改 - 当前位置天气,当前日期,时间,Google搜索输入框显示(可用/禁用) 4.改进 - 书签搜索质量改进。 - 提高书签爬行质量。 ※由于使用Chrome的目的,我们已经开发了不舒服...

Global site tag (gtag.js) - Google Analytics