Auto.js:


var heightlightindex = -1;
var timeout;
$(document).ready(function(){
    var wordinput = $("#word");
    //offset用于文档的偏移坐标
    var inputoffset = wordinput.offset();
    //自动补全的框最开始隐藏起来
    $("#auto").hide().css("border","1px black solid")
        .css("position","absolute")
        .css("top",inputoffset.top+wordinput.height()+10 )
        .css("left",inputoffset.left).width(wordinput.width());
    //给文本框加上按下并谈起的事件
    $("#word").keyup(function(event){
        var myevent = event||window.event;
        var keyCode = myevent.keyCode;
        //如果最新的信息为字母应当发送到服务器端
        if(keyCode >= 65 &&keyCode <= 90 || keyCode ==8|| keyCode ==46) {
            var wordText = $("#word").val();
            if(wordText!=""){
                //定义全局的timeout延迟使得减少和服务器端的交互
                //有效的提高其性能
                    clearTimeout(timeout);
                    timeout = setTimeout(function(){
                    $.post("AutoCompleteServlet",{word: wordText},function (data) {
                        //将返回的dom对象转化为jquery
                        var jqueryObj = $(data);
                        //找到所有的word节点并遍历
                        var wordNodes = jqueryObj.find("word");
                        var autoNode = $("#auto");

                        //清空原来的内容否则显示的文本框中的内容会越来越多
                        autoNode.html("");

                        wordNodes.each(function (i) {
                            //获取内容
                            var wordNode = $(this);
                            //新建div节点
                            var newDivNode = $("<div>").attr("id",i);
                            newDivNode.html(wordNode.text()).appendTo(autoNode);
                            //将新建的节点加入到弹出框窗口中
                            newDivNode.mouSEOver(function(){
                                if(heightlightindex != -1 ) {
                                    $("#auto").children("div").eq(heightlightindex)
                                        .css("background-color","white");
                                }
                                heightlightindex = $(this).attr("id");
                                $(this).css("background-color","red");

                            });
                            newDivNode.mouSEOut(function(){
                                $(this).css("background-color","white");
                            });

                            newDivNode.click(function(){
                                var comText =$(this).text();
                                $("#auto").hide();
                                heightlightindex = -1;
                                //填入文本框
                                $("#word").val(comText);
                            });
                        });
                        if (wordNodes.length > 0) {
                            autoNode.show();
                        } else {
                            autoNode.hide();
                        }
                    },"xml");
                },500);


            }else{
                $("#auto").hide();
                heightlightindex = -1;
            }
        }else if(keyCode == 38||keyCode == 40){
        //向上向下
            if(keyCode == 38) {//向上
                var autoNodes = $("#auto").children("div");
                if (heightlightindex != -1) {
                    autoNodes.eq(heightlightindex).css("background-color","white");
                    heightlightindex--;
                }
                else{
                    heightlightindex=autoNodes.length-1;
                }autoNodes.eq(heightlightindex).css("background-color","red");

            }else if(keyCode == 40){
                var autoNodes = $("#auto").children("div");
                if (heightlightindex != -1) {
                    autoNodes.eq(heightlightindex).css("background-color","white");
                }
                heightlightindex++;
                if(heightlightindex==autoNodes.length){
                    heightlightindex=0;
                }autoNodes.eq(heightlightindex).css("background-color","red");
            }
        }else if(keyCode == 13){
            //选中高亮部分
            if(heightlightindex!=-1){
                var comText = $("#auto").children("div").eq(heightlightindex).text();
                $("#auto").hide();
                heightlightindex = -1;
                //填入文本框
                $("#word").val(comText);
            }else{
                alert("文本框的[" + $("#word").val()+"]被提交了");
                $("#auto").hide();
                $("#word").blur();
            }
        }
    });
    //给按钮添加事件表示数据被提交
    $("input[type='button']").click(function(){
        alert("文本框的[" + $("#word").val()+"]被提交了");
    });
});


AutoComplete.html:


<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>AutoComplete</title>
    <script type="text/javascript" src="jslib/jquery-3.1.1.js"></script>
    <script type="text/javascript" src="jslib/Auto.js"></script>
</head>

<body>
    输入要搜索的字段:<input type="text" id="word" />
    <input type="button" value="提交"/><br/>
    <div id="auto"></div>
</body>

</html>


web.xml:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>AutoCompleteServlet</servlet-name>
        <servlet-class>AutoCompleteServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>AutoCompleteServlet</servlet-name>
        <url-pattern>/AutoCompleteServlet</url-pattern>
    </servlet-mapping>
</web-app>

提供的词汇库wordxml.jsp:


<%--
  Created by IntelliJ IDEA.
  User: Dqd
  Date: 2016/11/6
  Time: 10:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/xml;charset=UTF-8" language="java" %>
<%
    String str = request.getParameter("word");
%>
<words>
    <%if("anyone".startsWith(str)){%>
        <word>anyone</word>
    <%}%>
    <%if("anything".startsWith(str)){%>
         <word>anything</word>
    <%}%>
    <%if("absolute".startsWith(str)){%>
        <word>absolute</word>
    <%}%>
    <%if("boolean".startsWith(str)){%>
         <word>boolean</word>
    <%}%>
    <%if("break".startsWith(str)){%>
        <word>break</word>
    <%}%>
</words>


AutoCompleteServlet:

import javax.servlet.servletexception;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by Dqd on 2016/11/6.
 */
@WebServlet(name = "AutoCompleteServlet")
public class AutoCompleteServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException {
        String word = request.getParameter("word");
        System.out.println(word);
        request.setAttribute("word",word);
        request.getRequestdispatcher("wordxml.jsp")
                .forward(request,response);
    }

    protected void doGet(HttpServletRequest request,IOException {
        this.doPost(request,response);
    }
}

Ajax模拟百度搜索框的自动补全功能的更多相关文章

  1. 使用placeholder属性设置input文本框的提示信息

    这篇文章主要介绍了使用placeholder属性设置input文本框的提示信息,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios7 – WebView:IFRAME中的文本框停止接受输入

    的test.html:input.html:点按文本框内部并尝试输入.一切正常.现在点击文本框外部,然后再次点击内部,或者隐藏并显示虚拟键盘.现在打字不再起作用了.有没有人见过这个?id=133044中很难找到但已知的错误

  3. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  4. Swift UI专项训练2 本地化及自动布局

    首先我们新建一个工程,然后来做本地化,本地化就是根据用户设置的语言等等信息来显示。那么如何来设置呢,打开我们的工程,点开SupportingFiles中的Info.plist。现在我们来编辑第一个页面。在storyboard中增加一个文本框。自动布局就是我的文本框根据设备尺寸自动调整,专业术语叫约束,如何对文本框进行约束?

  5. [Swift]UIKit学习之UITextField的用法

    UIKit学习之UITextField的用法UITextField的创建:在Stroyboard中使用Ctrl+Drag拖拽法创建代码创建参考资料:

  6. Swift学习: 从Objective-C到Swift

    希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。我们熟悉的Objective-C特性在Swift中如何展现。从Objective-C到Swift的进步改进。然后值得注意的是,在Objective-C中,我们可以跨过property直接与instancevariable打交道,而在Swift是不可以的。ASwiftpropertydoesnothaveacorrespondinginstancevariable,andthebackingstoreforapropertyi

  7. Swift - 自定义函数规则说明

    如果要改变参数的值,就需要在定义函数的时候加上关键字var。789101112age=22add//无法编译add{age+=1}//可以编译add{age+=1}6,如果想要同时改变函数内外的参数值,可以利用inout关键字,同时调用函数的时候给参数加上前缀“&”addprint//23inout){}7,可以使用函数类型的参数10additive(a:ottom:auto!important;font-family:Consolas,b:a+b}//函数类型的参数printAdditiveResult

  8. Swift - 类初始化和反初始化方法init与deinit

    important;font-family:Consolas,newAge:32)print2,deinit():类反初始化方法11DBClass{conn:Connection?=()deinit{//可以做一些清理工作.conn!.close().conn=nil}db:()db=nil//设置nil后即可执行deinit()方法

  9. Swift - 下标脚本方法介绍及实例

    定义下标脚本之后,可以使用“[]”来存取数据类型的值。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960classSubString{varstr:String=""init{self.str=str;}/**下标脚本:获取/设置部分字符串**/subscript->String{get{return.substringWithRang

  10. Swift - 文本输入框UITextField的用法

    1,文本框的创建,有如下几个样式:UITextBorderStyle.None:无边框UITextBorderStyle.Line:直线边框UITextBorderStyle.RoundedRect:圆角矩形边框UITextBorderStyle.Bezel:边线+阴影1234lettextField=UITextField(frame:CGRectMake(10,160,200,30))//设置

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部