zoukankan      html  css  js  c++  java
  • 给文本框添加模糊搜索功能(“我记录”MVC框架下实现)

    步骤:

    1、在文本框中输入内容时,触发keyup事件;

    2、在keyup事件的处理方法中,通过Ajax调用控制器的方法;

    3、在控制器方法中,搜索满足条件的数据,这里分页获取数据,且只取第一页的数据,返回Json数据;

    4、JavaScript处理返回的数据,拼HTML,生成列表框,并为列表框添加鼠标点击事件;

    说明:

    1、实现了通过上下键和Enter键选择列表项功能;

    2、使用jQuery给文本框添加事件,尽量避免直接使用JavaScript,这样就不用考虑浏览器兼容问题了,因为jQuery已经做了。

    3、经过测试,支持IE、火狐、谷歌浏览器,测试使用的三种浏览器均为当前较新的版本。

    一、HTML代码和CSS代码:

    <tr>
        <td class="tdTitle">
            <span style="color: Red;">*</span>学校名称:
        </td>
        <td>
            <div>
                <input id="sclName" type="text" name="edu_Grade.Scl.Name" class="tipInput" tip=""
                    value="#{edu_Grade.Scl.Name}" autocomplete="off" />
                <span class="valid" msg="学校名称不能为空" mode="" rule="" ajaxaction="#{ajaxCheckUrl}">
                </span>
                <input id="hidSclName" type="hidden" name="edu_Grade.Scl" value="#{edu_Grade.Scl.Id}" />
                <!--模糊搜索结果显示div-->
                <div id="divSel" style="border: solid 1px #666; height: 95px;  200px; background-color: #fff;
                    position: absolute; display: none; overflow: auto; z-index: 99999;">
                </div>
            </div>
        </td>
    </tr>
    View Code
    <style type="text/css">
        .divItem:hover
        {
            cursor: pointer;
        }
        .divItem:nth-child(even)
        {
            background-color: #e9e9e9;
        }
        .tdTitle
        {
            width: 120px;
            text-align: right;
        }
        .itemHighlight
        {
            background-color: #6666aa !important;
            cursor: pointer;
        }
    </style>
    View Code

    二、JavaScript代码:

    <script type="text/javascript">
        _run(function () {
            $("#sclName").keyup(function (event) {
                searchSchool(event); //模糊搜索学校
            });
            $("#sclName").keydown(function (event) {
                searchKeyDown(this, event); //上下键和Enter键
            });
            $("body").click(function () {
                $("#divSel").css("display", "none"); //模糊搜索结果显示div
            });
        });
    
        //模糊搜索学校
        var lastKey = "";
        function searchSchool(evt) {
            var key = $.trim($("#sclName").val()); //取用户输入的关键字
    
            if (key == "" && evt.keyCode != 38 && evt.keyCode != 40 && evt.keyCode != 13) { //如果用户输入的关键字为空,则不搜索
                $("#divSel").css("display", "none");
                return;
            }
    
            if (key != lastKey && evt.keyCode != 38 && evt.keyCode != 40 && evt.keyCode != 13) {
                $.ajax({
                    type: "GET",
                    url: "#{searchSchoolUrl}",
                    data: "key=" + escape(key), //传参
                    success: function (data) {
                        if (data.length && data.length != 0) { //如果结果不为空
                            maxIndex = data.length - 1;
                            $("#divSel").css("display", "");
    
                            var html = "";
                            for (var i = 0; i < data.length; i++) {
                                html += "<div onclick='divItemClick(this)' itemId='" + data[i].Id + "' itemIndex='" + i + "' class='divItem' onmouseover='divItemMouseOver(this)' >" + data[i].Name + "</div>";
                            }
    
                            $("#divSel").html(html);
                            $("#sclName").css("border", "solid 1px #000");
                        }
                        else { //搜索不到结果
                            $("#sclName").css("border", "dashed 1px red");
                            $("#divSel").css("display", "none");
                            $("#hidSclName").val("");
                        }
    
                        if (data.length = 1) { //搜索结果有且只有一个
                            $("#hidSclName").val(data[0].Id);
                        }
                    }
                });
            }
        }
    
        //模糊搜索结果选项点击事件
        function divItemClick(obj) {
            $("#sclName").val($(obj).text());
            $("#sclName").css("color", "#000");
            $("#hidSclName").val($(obj).attr("itemId"));
            $("#sclName").focus();
            $("#divSel").css("display", "none");
            $("#sclName").blur();
        }
    
        //上下键和Enter键
        var itemIndex = -1;
        var maxIndex = -1;
        function searchKeyDown(obj, evt) {
            if (evt.keyCode != 38 && evt.keyCode != 40 && evt.keyCode != 13) {
                itemIndex = -1;
            }
    
            var key = $.trim($("#sclName").val()); //取用户输入的关键字
            lastKey = key;
    
            if (evt.keyCode == 40) { //下移
    
                if (itemIndex >= 0) {
                    var preItem = $("#divSel").find("div:eq(" + itemIndex + ")");
                    preItem.removeClass("itemHighlight");
                }
                if ($("#divSel").find("div:eq(" + (itemIndex + 1) + ")").length > 0) {
                    itemIndex++;
                }
                else {
                    itemIndex = 0;
                }
                var item = $("#divSel").find("div:eq(" + itemIndex + ")");
                item.addClass("itemHighlight");
    
                if ($("#divSel").scrollTop() < item.height() * (itemIndex - 4) || $("#divSel").scrollTop() > item.height() * (itemIndex + 4)) {
                    $("#divSel").scrollTop(item.height() * (itemIndex - 4));
                }
            }
    
            if (evt.keyCode == 38) { //上移
                if (itemIndex >= 0) {
                    var preItem = $("#divSel").find("div:eq(" + itemIndex + ")");
                    preItem.removeClass("itemHighlight");
                }
                if (itemIndex > 0) {
                    itemIndex--;
                }
                else {
                    itemIndex = maxIndex;
                }
                var item = $("#divSel").find("div:eq(" + itemIndex + ")");
                item.addClass("itemHighlight");
    
                if ($("#divSel").scrollTop() > item.height() * itemIndex || $("#divSel").scrollTop() < item.height() * (itemIndex - 4)) {
                    $("#divSel").scrollTop(item.height() * itemIndex);
                }
            }
    
            if (evt.keyCode == 13) { //Enter
                var item = $("#divSel").find("div:eq(" + itemIndex + ")");
                item.click();
                var key = $.trim($("#sclName").val()); //取用户输入的关键字
                lastKey = key;
                evt.returnValue = false;
            }
        }
    
        //鼠标移入
        function divItemMouseOver(obj) {
            var item = $("#divSel").find("div");
            item.removeClass("itemHighlight");
            itemIndex = parseInt($(obj).attr("itemIndex"));
            item = $(obj);
            item.addClass("itemHighlight");
            $("#sclName").focus();
        }
    </script>
    View Code

    三、控制器代码:

    /// <summary>
    /// 查询学校
    /// </summary>
    public void SearchSchool()
    {
        string key = (string)ctx.Get("key");
    
        List<Edu_School> sclList = edu_SchoolService.GetListByNameKey(key);//根据关键字查询学校集合
        if (sclList != null && sclList.Count > 0)
        {
            List<Dictionary<string, string>> dicList = new List<Dictionary<string, string>>();
    
            foreach (Edu_School scl in sclList)
            {
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add("Id", scl.Id.ToString());
                dic.Add("Name", scl.Name);
                dicList.Add(dic);
            }
    
            echoJson(dicList);
        }
        else
        {
            echoText(null);//搜索不到返回空
        }
    }
    View Code

    效果图:

  • 相关阅读:
    BZOJ1146:[CTSC2008]网络管理
    AtCoder Grand Contest 004 C:AND Grid
    BZOJ3295:[CQOI2011]动态逆序对
    AtCoder Regular Contest 070F:Honest Or Unkind
    BZOJ3110:[ZJOI2013]K大数查询
    BZOJ3196:二逼平衡树
    浅谈splay
    BZOJ3938:Robot
    浅谈标记永久化
    AtCoder Regular Contest 068E:Snuke Line
  • 原文地址:https://www.cnblogs.com/s0611163/p/3561456.html
Copyright © 2011-2022 走看看