zoukankan      html  css  js  c++  java
  • 输入框实时模糊匹配输入

    一、大致原理

     -> 监听键盘按键up事件 ->  键盘连续快速输入查询条件 -> 停止输入,按键弹起 -> 检测是否存在缓存 -> 如果没有缓存,向后台发送ajax请求 -> 执行sql查询 -> 返回数据到页面展示

       ->  如果有缓存,则读取缓存 -> 返回数据到页面展示

     二、简单实例——待改进与更新示例

      参考自:http://blog.csdn.net/yuanyuan214365/article/details/63254539

      前台页面

        前台只是修改了ajax返回值的部分:

    <%@ page contentType="text/html;charset=UTF-8" %>
    <%@ include file="/WEB-INF/views/include/taglib.jsp"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <title>模糊匹配</title>  
     <script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script>  
     <style type="text/css">    
        #searchresult    
        {    
            width: 140px;    
            position: absolute;    
            z-index: 1;    
            overflow: hidden;    
            left: 140px;    
            top: 71px;    
            background: #E0E0E0;    
            border-top: none;    
              
        }    
        #txt_search  
        {  
           font-size:15px;  
           height:20px;  
        }  
        .line    
        {    
            font-size: 15px;    
            background: #E0E0E0;    
            width: 140px;    
            padding:0px;    
        }    
        .hover    
        {    
            background: #007ab8;    
            width: 140px;    
            color: #fff;    
        }    
        .std    
        {    
            width: 150px;    
        }    
    </style>   
     </head>  
    <body>  
          success page  
            
        <form id="form1" runat="server">    
        <div>    
            智能模糊查询提示    
            <input id="txt_search" type="text" style="140px;" />    
            <div id="searchresult" style="display: none;">    
            </div>    
         </div>         
         </form>        
           
           <script type="text/javascript">    
            $(function () {    
                $("#txt_search").keyup(function (evt) {    
                    ChangeCoords(); //控制查询结果div坐标    
                    var k = window.event ? evt.keyCode : evt.which;    
                    //输入框的id为txt_search,这里监听输入框的keyup事件    
                    //不为空 && 不为上箭头或下箭头或回车    
                    if ($("#txt_search").val() != "" && k != 38 && k != 40 && k != 13) {   
                        var keyWord = $("#txt_search").val();
                        $.ajax({    
                            type: 'GET',    
                            async: true, //同步执行,不然会有问题    
                            dataType: "json",    
                            url: "http://192.168.10.98:8080/jeesite/f/test/test/testSearch?userName="+keyWord,   //提交的页面/方法名    
                           // data: "{'userName':'" + $("#txt_search").val() + "'}",             //参数(如果没有参数:null)    
                             
                            error: function (msg) {//请求失败处理函数    
                                alert("数据加载失败");    
                            },    
                            success: function (data) { //请求成功后处理函数。    
                               /*  var objData = eval("(" + data.userName + ")");   */  
                               //var data = eval(result);
                                 console.log(data); 
                                if (data.length > 0) {    
                                    var layer = "";    
                                    layer = "<table id='aa'>";    
                                   $.each(data, function (idx, item) {    
                                        layer += "<tr class='line'><td class='std'>" + item.assoWord + "</td></tr>"; 
                                    });
                                    layer += "</table>";    
                                    //将结果添加到div中        
                                    $("#searchresult").empty();    
                                    $("#searchresult").append(layer);    
                                    $(".line:first").addClass("hover");    
                                    $("#searchresult").css("display", "");    
                                    //鼠标移动事件    
        
                                    $(".line").hover(function () {    
                                        $(".line").removeClass("hover");    
                                        $(this).addClass("hover");    
                                    }, function () {    
                                        $(this).removeClass("hover");    
                                        //$("#searchresult").css("display", "none");    
                                    });    
                                    //鼠标点击事件    
                                    $(".line").click(function () {    
                                        $("#txt_search").val($(this).text());    
                                        $("#searchresult").css("display", "none");    
                                    });    
                                } else {    
                                    $("#searchresult").empty();    
                                    $("#searchresult").css("display", "none");    
                                }    
                            }    
                        });    
                    }    
                    else if (k == 38) {//上箭头    
                        $('#aa tr.hover').prev().addClass("hover");    
                        $('#aa tr.hover').next().removeClass("hover");    
                        $('#txt_search').val($('#aa tr.hover').text());    
                    } else if (k == 40) {//下箭头    
                        $('#aa tr.hover').next().addClass("hover");    
                        $('#aa tr.hover').prev().removeClass("hover");    
                        $('#txt_search').val($('#aa tr.hover').text());    
                    }    
                    else if (k == 13) {//回车    
                        $('#txt_search').val($('#aa tr.hover').text());    
                        $("#searchresult").empty();    
                        $("#searchresult").css("display", "none");    
                    }    
                    else {    
                        $("#searchresult").empty();    
                        $("#searchresult").css("display", "none");    
                    }    
                });    
                $("#searchresult").bind("mouseleave", function () {    
                    $("#searchresult").empty();    
                    $("#searchresult").css("display", "none");    
                });    
            });    
            //设置查询结果div坐标    
        
            function ChangeCoords() {    
                //    var left = $("#txt_search")[0].offsetLeft; //获取距离最左端的距离,像素,整型    
                //    var top = $("#txt_search")[0].offsetTop + 26; //获取距离最顶端的距离,像素,整型(20为搜索输入框的高度)    
                var left = $("#txt_search").position().left; //获取距离最左端的距离,像素,整型    
                var top = $("#txt_search").position().top + 20; ; //获取距离最顶端的距离,像素,整型(20为搜索输入框的高度)    
                $("#searchresult").css("left", left + "px"); //重新定义CSS属性    
                $("#searchresult").css("top", top + "px"); //同上    
            }    
        
        </script>    
    </body>  
    </html>  
    View Code

        ajax部分:(仅作为示例,实际使用时请修改为合适变量名等)

    var keyWord = $("#txt_search").val();
                        $.ajax({    
                            type: 'GET',    
                            async: true, //同步执行,不然会有问题    
                            dataType: "json",    
                            url: "http://192.168.10.98:8080/jeesite/f/test/test/testSearch?userName="+keyWord,   //提交的页面/方法名    
                           // data: "{'userName':'" + $("#txt_search").val() + "'}",             //参数(如果没有参数:null)    
                             
                            error: function (msg) {//请求失败处理函数    
                                alert("数据加载失败");    
                            },    
                            success: function (data) { //请求成功后处理函数。    
                               /*  var objData = eval("(" + data.userName + ")");   */  
                               //var data = eval(result);
                                 console.log(data); 
                                if (data.length > 0) {    
                                    var layer = "";    
                                    layer = "<table id='aa'>";    
                                   $.each(data, function (idx, item) {    
                                        layer += "<tr class='line'><td class='std'>" + item.assoWord + "</td></tr>"; 
                                    });
                                    layer += "</table>";    
                                    //将结果添加到div中        
                                    $("#searchresult").empty();    
                                    $("#searchresult").append(layer);    
                                    $(".line:first").addClass("hover");    
                                    $("#searchresult").css("display", "");    
                                    //鼠标移动事件    
        
                                    $(".line").hover(function () {    
                                        $(".line").removeClass("hover");    
                                        $(this).addClass("hover");    
                                    }, function () {    
                                        $(this).removeClass("hover");    
                                        //$("#searchresult").css("display", "none");    
                                    });    
                                    //鼠标点击事件    
                                    $(".line").click(function () {    
                                        $("#txt_search").val($(this).text());    
                                        $("#searchresult").css("display", "none");    
                                    });    
                                } else {    
                                    $("#searchresult").empty();    
                                    $("#searchresult").css("display", "none");    
                                }    
                            }    
                        });  

      后台部分:

        实际使用时可改为实时从数据库查询

     private static Logger log = LoggerFactory.getLogger(TestController.class);
        
        @RequestMapping(value = "/testSearch", method = RequestMethod.GET)
        @ResponseBody
        public List<AssociateWord> testSearch(@RequestParam("userName") String k, HttpServletResponse response) {
            List<AssociateWord> list = new ArrayList<AssociateWord>();
            System.out.println("搜索关键字:"+k);
            boolean b = StringUtils.isBlank(k);
            //AssociateWord aw = new AssociateWord();
            if (!b) {   //不为空(可构造其他条件)
                log.debug(">>>>>>>>>>搜索关键字非空");
                //构造和k相关的词
                for (int i =0; i<5; i++) {
                    AssociateWord aw = new AssociateWord();
                    String s = "关键字"+i;
                    System.out.println(s);
                    aw.setAssoWord(s);
                    list.add(aw);
                }
                response.setHeader("Access-Control-Allow-Origin", "*");
                return list;
            } else {
                log.debug(">>>>>>>>>>搜索关键字为空");
                response.setHeader("Access-Control-Allow-Origin", "*");
                //可构造热门搜索等
                return list;
            }
        }
    View Code

         实体类:(请根据实际情况改造)

    package com.thinkgem.jeesite.modules.test.entity;
    
    /**
     * 描述:联想提示词封装类
     * @author Administrator
     * @date 2017年8月22日
     */
    public class AssociateWord {
    
        private String assoWord;
    
        public String getAssoWord() {
            return assoWord;
        }
    
        public void setAssoWord(String assoWord) {
            this.assoWord = assoWord;
        }
        
        
    }
    View Code
  • 相关阅读:
    protobuf简单测试应用
    golang代码片段(摘抄)
    ibatis中 $ 于 # 的 区别?
    eclipse debug 执行到断点处并没有停下,断点无效问题
    使用selenium遇到java.lang.NoSuchMethodError: org.apache.xpath.XPathContext,排查
    设置MAVEN_OPTS的推荐方法
    UI型Bug定义的处理方法
    select count(*)和select count(1)的区别
    mac下搭建java开发环境:eclipse+tomcat+maven
    eclipse中svn提交报错的解决
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7404349.html
Copyright © 2011-2022 走看看