js模仿搜索引擎自动提示

在文本框中随着输入的值显示相关的数据,类似于搜索引擎

测试数据放在xml文件中:

1,sourceInfo.xml

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <label id="a">
        <content>abuse</content>
        <content>abstract</content>
        <content>accede</content>
        <content>accelerate</content>
        <content>accent</content>
        <content>adverb</content>
        <content>adverse</content>
        <content>accent</content>
        <content>accelerate</content>
        <content>advance</content>
        <content>affect</content>
    </label>
    <label id="b">
        <content>bake</content>
        <content>baggy</content>
        <content>ball</content>
        <content>band</content>
        <content>bed</content>
        <content>beck</content>
    </label>
    <label id="c">
        <content>copy</content>
        <content>condition</content>
        <content>conduct</content>
    </label>
</list>

2,jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>模仿搜索引擎      ---- maple 2014.09.08</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="styles.css">
    -->
    <style type="text/css">
        body{
            width:800px;
            margin:100px auto;
        }
        #rel{
            position:absolute;
            width:450px;
            height:305px;
            top:200px;
            left:400px;
        }
        #box{
            position:absolute;
            width:560px;
            height:50px;
            top:150px;
            left:400px;
        }

        #txtContent{
            border:1px solid green;
            width:450px;
            height:50px;
            line-height:50px;
            font-size:25px;
            float:left;
        }

        a{
            text-decoration:none;
            width:110px;
            height:50px;

            font-size:22px;
            text-align:center;
            font-weight:bold;
            line-height:50px;
            display:block;
            color:white;
            float:right;
            background-color:#23AC3E;
        }
        ul{
            padding:0px;
            margin:0px;
        }
        li{
            padding-left:5px;
            list-style:none;
            font-size:25px;
        }
        .focus{
            background-color:#efefef;
        }
        .myUl{
            border:1px solid #ccc;
        }
    </style>
    <script type="text/javascript" src="js/json2.js"></script>
    <script type="text/javascript">
    var txtContent; //保存文本框对象
    var rel; //保存智能提示用的div对象
    var ul; //无序列表对象,放每个提示信息
    var focus; //按上下键时,保存当前选中项这个li对象

    var JSONAjax={

        xmlHttpreq : false,

        createXMLHttpReq : function() {  //创建XHR对象
            if (window.XMLHttpRequest) {
                // Mozilla
                xmlHttpreq = new XMLHttpRequest();
            } else {
                // IE
                if (window.ActiveXObject) {
                    try {// 比较新的版本
                        xmlHttpreq = new ActiveXObject("Msxml2.XMLHttp");
                    } catch (e) {
                        try {// 失败就创建比较老的版本
                            xmlHttpreq = new ActiveXObject("Microsoft.XMLHttp");
                        } catch (e) {
                        // 还失败就回家种田
                        }
                    }
                }//end of if
            }//end of else
        }, //end of create

        //发送请求(核心!!!)
        sendreq : function(value) {
            url="ReminderServlet?content="+value;
            //调用创建XMLREQ对象 的方法
            JSONAjax.createXMLHttpReq();
            //指定回调函数
            xmlHttpreq.onreadystatechange= JSONAjax.handleResponse;
            //建立连接
            xmlHttpreq.open("GET", url, true); //异步传输
            //发送数据
            xmlHttpreq.send(null);
        },

        //处理响应
         handleResponse:function() {
        // 判断XHR的状态
            if (xmlHttpreq.readyState == 4) {
                // 回应的状态=200,表示成功返回了服务器的内容
                if (xmlHttpreq.status == 200) {
                    var str=xmlHttpreq.responseText;    

                    var obj=JSON.parse(str);//解析成json对象
                    var len=ul.childNodes.length;
                    //移除ul原有项
                    for(var j=0;j<len;j++){
                        ul.removeChild(ul.firstChild);
                    }
                    //规定最多显示10条提示信息
                    var count=obj.count>10?10:obj.count;
                    //动态添加提示信息
                    for(var i=0;i<count;i++){
                        var li=document.createElement("li");
                        var txt=document.createTextNode(obj["a"+i]);
                        li.appendChild(txt);
                        ul.appendChild(li);
                    }
                    //如果ul中有li项,则通过添加类样式来显示边框
                    if(ul.childNodes.length>0){
                        ul.className="myUl";
                    }else{  //如果没有了提示项,则去除类样式
                        ul.className="";
                    }
                }//end status==200
            }//end readyState==4
        }, //end handleResponse

        //为组件添加事件:组件,要绑定的事件类型,处理事件的函数,是否捕获
        addEvent: function(elm, evType, fn, useCapture){
                    //支持火狐
                    if (elm.addEventListener){
                            elm.addEventListener(evType, fn, useCapture);
                            return true;
                    } else if (elm.attachEvent) {
                    //支持IE
                        var r = elm.attachEvent(‘on‘ + evType, fn);
                        return r;
                    } else {
                        elm[‘on‘ + evType] = fn;
                    }
                },

            //初始化
            init:function(){
                txtContent=document.getElementById("txtContent");
                rel=document.getElementById("rel");

                ul=document.createElement("ul");
                rel.appendChild(ul);//显示提示信息的无序列表放在id=rel的div块中
                focus=null;

                txtContent.onkeyup=function(event){
                    var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
                    if(keyCode==38){ //向上方向键
                        //alert("up");
                        if(focus!=null&&focus!=ul.childNodes[0]){
                            focus.className="";
                            focus=focus.previousSibling;
                            focus.className="focus";
                            //把方向键选择项的值放在文本框中
                            txtContent.value=focus.textContent;
                        }
                        return;

                    }else if(keyCode==40){ //向下
                        //alert("down");
                        if(focus==null){
                            focus=ul.childNodes[0];
                        }else if(focus==ul.lastChild){
                            return;
                        }else{
                            focus.className="";
                            focus=focus.nextSibling;
                        }
                        txtContent.value=focus.textContent;
                        focus.className="focus";
                        return;        

                    }else if(keyCode==13){  //回车
                        window.location.href="http://www.baidu.com";
                    }
                    JSONAjax.sendreq(this.value);
                };
            },

    }; //end of JSONAjax

    //初始化[相当于调用 了<body > ]
    JSONAjax.addEvent(window,‘load‘,JSONAjax.init,false);

    </script>
  </head>

  <body>
    <div id="box">
    <input type="text" name="txtContent" id="txtContent">
   <a href="#">千寻一下</a>
    </div>
    <div id="rel">
    </div>

  </body>
</html>

3,servlet

package com.maple.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ReminderServlet extends HttpServlet {

    /**
     * Constructor of the object.
     */
    public ReminderServlet() {
        super();
    }

    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        //获取输入的文本内容
        String content=request.getParameter("content");
        SAXBuilder sax=new SAXBuilder();
        File file=new File("E:\\myJava\\javafrom20140825\\myself\\assignment_mockbaidu\\src\\sourceInfo.xml");

        try {
            Document doc=sax.build(file);
            Element root =doc.getRootElement(); //list
            List labels=root.getChildren("label");
            String id=null;

            //用于保存目标标签块,例如输入abu,则保存a标签块的内容
            Element target=null;
            JSONObject job=new JSONObject();

            //寻找与输入的首字母相同的标签块
            for(int i=0;i<labels.size();i++){
                id=((Element)(labels.get(i))).getAttributeValue("id");
                if(content.indexOf(id)==0){
                    target=(Element)(labels.get(i));
                    break;
                }
            }
            //如果找到了与首字母匹配的标签块
            if(target!=null){
                List con=target.getChildren("content");
                int count=0;
                for(int j=0;j<con.size();j++){
                    Element temp=(Element)(con.get(j));
                    String tempContent=temp.getText();        

                    //如果content标签内的值与文本值前面相同,则保存在json对象中,
                    //这是真正的有效值,需要回传给客户端
                    if(tempContent.indexOf(content)!=-1){
                        job.put("a"+count, tempContent);
                        ++count;
                    }
                }
                //最后加上有效键值对的个数,方便客户端读取
                job.put("count", count);
            }
            out.print(job);

        } catch (JDOMException e) {
            e.printStackTrace();
        }
        out.flush();
        out.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }

    public void init() throws ServletException {
        // Put your code here
    }

}
时间: 2024-10-29 19:09:52

js模仿搜索引擎自动提示的相关文章

配置eclipse编写html/js/css/jsp/java时自动提示

配置eclipse编写html/js/css/jsp/java时自动提示步骤: 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation triggers for java的值为:zjava   点击apply按钮 如图: 2.继续打开JavaScript→Editor→Content Assist 修改Auto Activation triggers for JavaScript的值为:zjs  

基于js 的自动提示控件

最近在工作中需要自动提示的功能,本身单独的这个控件来开发难度不是很大,特别是针对项目需求对应的单一功能,但是为了让开发出的控件可以随意使用,动态配置,那么这就需要一定的时间来开发了. 先说一下我们这个自动提示的功能的要求,在input控件中输入一些值,在对应的下方会有对应合适的选项,类似百度自动提示的功能.我的这个控件为了可以在很多地方可以不做修改的进行引入,所以支持方法配置,样式配置,不需要任何其他js库,使用ajax实现等功能,在调用的时候只需一个div 给出对应的id和方法名就可以的,还可

js实用表单模糊搜索和自动提示插件

fuzzysearch是一款实用的表单模糊搜索和自动提示js插件.该js插件允许你只输入部分字符串,根据这部分字符串自动搜索和匹配,并给出自动替代选项.适用于各种数据的快速检索. 在线演示:http://www.htmleaf.com/Demo/201503081485.html 下载地址:http://www.htmleaf.com/jQuery/Form/201503081484.html

百度地图之自动提示--autoComplete

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> <title>百度地图之

AjaxPro局部刷新(输入时自动提示功能)

效果图 1.前台页面 <td class="queryLeft">股票名称:</td> <td class="queryRight"> <asp:TextBox ID="txtShareName" CssClass="shareName" onkeyup="prompt(this)" runat="server" autocomplete=&qu

实现搜索框自动提示功能(jquery+php)

客户端代码 <html> <head> <style> #search{font-size:14px;} #search .k{padding:2px 1px; width:320px;} #search_auto{border:1px solid #817FB2; position:absolute; display:none;} #search_auto li{background:#FFF; text-align:left;} #search_auto li.cl

简单的文本框输入自动提示

简单的文本框输入自动提示--输入的时候可以直接异步加载数据库中匹配的项,然后显示出来. 这里没有使用到数据库,直接在PHP用数组模拟数据存储.  demo演示 原理主要是: 监听输入框的状态,当有改变的时候即刻通过ajax发送数据并取得返回值. 主要使用了jQuery封装很方便,但貌似我这个兼容性不咋地...主要提供个思路吧~ js部分: <script type="text/javascript" src="./js/jquery.min.js">&l

JS模仿腾讯微博app撕纸效果

本来想用css3来实现,但后来脑袋一热就用了js,省的别人你ie怎么没效果啊!在腾讯微博app上看到的一个效果,鼠标击哪里就撕了哪里,跟撕报纸似的,任意点击左边面的灰色区域,查看效果,当时觉得很有意思,问了下高人,突然觉悟了,原来如此. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt

MyEclipse设置自动提示

一  MyEclipse设置自动提示: 1.快捷键提示代码 window-->Preferences的General-->Keys下修改Content Assist的快捷键为Alt+/,这样就可以通过快捷键得到提示代码. 一般,快捷键默认就是Alt+/. 2.自动提示 window-->preferences的java->Editor->Content Assist,选上Enable auto activation选择框. 3.增强自动提示 如果在上面2中的Auto acti