上个文章已经实现自动提示的功能,但是看过的童鞋们都知道我的交互使用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;
}
}
效果同样实现,大家可以修改试试,要引的包大家在下面下载:
分享到:
相关推荐
为了解决这个问题,开发者可以使用 AndroidBug5497Workaround 类,这个类可以使得软键盘不挡住输入框,并且可以在多个 Android 版本上使用。使用这个类非常简单,只需要将其复制到项目中,并在需要的 activity 的 ...
无论是修复bug、添加新功能还是改进现有设计,都能通过GitHub上的adapta-project/adapta-gtk-theme仓库进行贡献。最新版本e517226包含了项目的最新改进和修复。 总之,Adapta-gtk-theme为Linux用户带来了Material ...
此外,由于每个新版本的Chromedriver都会修复一些bug和增加新的功能,所以定期更新Chromedriver也是必要的。 总之,Chromedriver-win64_124.0.6346.0.zip这个压缩包是自动化测试中不可或缺的一部分,它使得开发者...
"RC"代表"Release Candidate",意味着这个版本是最终正式版发布前的最后一个测试版本,通常在修复大量bug和优化性能后推出,以确保软件稳定性。 Firefox 2.0的改进与特性: 1. **Tabbed Browsing(标签浏览)**:...
"CHANGELOG.md"文件记录了项目的版本更新历史,包括每次升级引入的新功能、修复的bug以及任何重大变更。这有助于开发者跟踪项目的演化,并决定是否需要更新到新版本。 "public"目录通常包含应用的静态资源,如HTML...
6. **更新与维护**:作为一款模仿和创新的作品,"baidu_appwidget"可能会持续迭代更新,以修复潜在的bug,增加新功能,保持与百度官方应用的兼容性。 【标签】"百度"表明这款小部件专注于提供百度搜索服务;"搜索...
在3.0.1.98版本中,谷歌可能进行了性能优化和bug修复,提升了输入的稳定性和用户体验。而2.7.25.128作为官方最后的正式版,可能是一些用户钟爱的老版本,因为某些用户可能对新版本的某些变化不适应,或者认为旧版本...
文档首先提到,谷歌音乐的搜索栏提示功能是一个很受欢迎的特性,它能够在用户输入搜索词时提供自动补全建议,提高用户搜索效率。然而,这一功能存在一个小bug。具体来说,当用户在页面加载时快速定位到搜索栏并输入...
GWT(Google Web Toolkit)是Google开发的一个开源工具包,用于构建高性能、跨浏览器的JavaScript应用程序。这个框架允许开发者使用Java语言编写客户端代码,然后通过编译器将其自动转换为优化过的JavaScript,使得...
② 关于内置的图片暗箱效果的使用,添加图片后,需要把图片链接到原图片,即在img标签再外套一个a标签方能实现图片暗箱(简单点就是图片或文章的链接是一张图片的地址,点击便自动使用暗香功能,本文介绍前面的文字...
8. **版本控制**:MobyFactory可能会发布不同的版本,每个版本可能包含新功能、bug修复或性能改进,开发者需要关注版本更新以获取最新的改进。 9. **社区支持**:开源项目通常有社区支持,开发者可以在社区论坛或...
在IT领域,前端开发是不可或缺的一部分,而AngularJS作为一款由Google维护的JavaScript框架,被广泛应用于构建动态Web应用。本项目是一个基于AngularJS 1.4版本实现的TodoList,旨在帮助用户管理日常任务,同时也为...
版本6.5.3是该软件的一个更新版本,通常会包含性能优化、错误修复以及可能的新功能。 QTranslate的核心特点在于其便捷性,用户只需选中待翻译的文本,按下热键(通常是Ctrl+Q),即可快速弹出翻译窗口,显示翻译...
通常,版本号的升级意味着新功能的添加、性能的优化、bug的修复以及对设计趋势的跟进。这个版本可能包含改进的组件、新的主题选项或者对不同设备和平台的支持。 在标签中,“MaterialPro”和“Version 4.4”被再次...
v1.0.2是该框架的一个版本更新,提供了更多的功能优化和bug修复,以确保更稳定和流畅的用户体验。 在"MDUI前端框架 v1.0.2.zip"这个压缩包中,包含了两个主要的文件: 1. **说明.htm**:这是一个HTML文档,通常...
8. **异常处理与错误报告**:为了提高应用稳定性,我们需要处理可能出现的异常,提供友好的错误提示,并可能通过日志或Crashlytics等工具收集错误信息,以便及时发现和修复bug。 9. **测试与调试**:应用开发过程中...
Chrome壁纸自定义 - 壁纸图像可以随机更改 - 当前位置天气,当前日期,时间,Google搜索输入框显示(可用/禁用) 4.改进 - 书签搜索质量改进。 - 提高书签爬行质量。 ※由于使用Chrome的目的,我们已经开发了不舒服...