输入框实时模糊匹配输入

一、大致原理

 

 -> 监听键盘按键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="width: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

 

posted @ 2017-08-21 14:48  ---江北  阅读(2089)  评论(0编辑  收藏  举报
TOP