美文网首页
基于jq搜素框,包含前端模糊查询,提示,点击选择等功能

基于jq搜素框,包含前端模糊查询,提示,点击选择等功能

作者: WEB前端含光 | 来源:发表于2020-07-29 16:46 被阅读0次

上图



上代码

html(不推荐这样写行内css,在此为了方便复制过来,看起来更直观)

<div class="layui-nav-item clearfix" style="padding: 0 4px;width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top: 20px;" id="box">
        <input type="text" style="width: 70%;float: left;margin-left: 5px;display: none;height:28px;" name="title" i18n-placeholder="请输入搜索条件" autocomplete="off" class="layui-input" id="mainSearchInpt">
        <button type="button" class="layui-btn" style="width: 51px;padding: 0;float: left;height:28px;line-height: 28px;" id="mainSearchBtn" ew-event="search"><i class="layui-icon layui-icon-search"></i></button> 
</div>
复制代码

js,重点 仅提供思路,完全复制是可能会出错的,因为里面 业务逻辑 不一定适合你的项目(很简单,很容易剥离出你需要的部分) 不查询后端,仅获取菜单数据,筛选数据,然后带该数据为参数,触发点击事件,打开对应菜单页面(因为是菜单搜索功能)

// 判断当前侧栏是否展开     我的业务逻辑,你或许不需要这个部分
            let a = $('.layui-layout-admin').hasClass('admin-nav-mini')
            console.log(a)
            if (a == true) {
                console.log(true)
                $('#mainSearchInpt').hide()
            } else {
                console.log(false)
                $('#mainSearchInpt').show()
            }
            
            /*根据id获取元素对象*/
            function my$(id) {
                return document.getElementById(id);
            }

            /**
             * 设置任意元素的中间文本内容
             * @param {*} element 标签元素
             * @param {*} text    文本内容
             */
            function setInnerText(element, text) {
                if (typeof element.textContent === "undefined") {
                    element.innerText = text;
                } else {
                    element.textContent = text;
                }
            }
            // 递归查找,这是我接口返回的数据格式,你可以根据你的数据配置下面的代码
            var allItem = []
            function find(arr) {
                if (arr == null) { return null };
                arr.forEach(function (item, index, arr) {
                    if (item.search && !item.nav) {
                        allItem.push(item.search);
                    } else {
                        find(item.nav);
                    }
                })
                return allItem;
            }
            var keywords;

            $.ajax({
                url: '/xxxxxxxx/xxxx/xxx',         //获取数据的接口
                data: {},
                type: 'get',
                dataType: 'json',
                success: function (res) {
                    let alldata = res.data;
                    let obj = find(alldata);
                    keywords = obj;
                }
            });

            var tempArr = []; //临时数组
            var isMask = false;//是否已存在遮盖层
            $(document).on("keyup", "#mainSearchInpt", function () {
                var text = this.value.trim();
                // 判断是否存在下拉框,存在删除,
                if (my$("dv")) {
                    my$("box").removeChild(my$("dv"));
                } else {
                    // Do-nothing
                }

                // 临时数组初始化,处理临时数组数据
                tempArr = [];
                for (let i = 0; i < keywords.length; i++) {
                    if ((keywords[i].indexOf(text) !== -1) && (0 != text.length)) {
                        tempArr.push(keywords[i]);
                    }
                }

                // 文本框是空的,临时数组也是空的,不用创建div
                if (this.value.length == 0 || tempArr.length == 0) {
                    // 如果页面中又这个div,删除这个div
                    if (my$("dv")) {
                        my$("box").removeChild(my$("dv"));
                    }
                    return;
                }

                // 创建div,把div加入到id="box"的标签中
                var dvObj = document.createElement("div");
                my$("box").appendChild(dvObj);
                dvObj.id = "dv";
                dvObj.style.width = "350px";
                dvObj.style.border = "1px solid green";
                dvObj.style = `position:fixed;background-color:#fff;top:98px;left:9px;width:190px;z-index:9999;max-height:200px;overflow:scroll;`
                // 遍历tempArr数组,创建p,添加到dvObj里面
                for (let i = 0; i < tempArr.length; i++) {
                    var pObj = document.createElement("p");
                    // pObj.innerHTML = tempArr[i];
                    // 在p标签内部添加文本文字
                    setInnerText(pObj, tempArr[i]);
                    dvObj.appendChild(pObj);

                    // 注册鼠标进入事件,鼠标进入,添加背景色
                    pObj.onmouseover = function () {
                        this.style.backgroundColor = "#E9EDF0";
                    };

                    // 注册鼠标移除事件,鼠标移除,移除背景色
                    pObj.onmouseout = function () {
                        this.style.backgroundColor = "";
                    };

                    // 注册鼠标点击事件  出于特殊业务逻辑考虑 我没有用click,当然你可以用click
                    pObj.onmousedown = function () {
                        $('#mainSearchInpt').val(tempArr[i])
                        $('#mainSearchBtn').click()
                        if (my$("dv")) {
                            my$("box").removeChild(my$("dv"));
                        }
                        if (my$("mask")) {
                            my$("box").removeChild(my$("mask"));
                        }
                        $('#mainSearchInpt').val('')
                        isMask = false
                    };
                }
                
                //遮盖层   透明   用于点击其他地方关闭搜索框的下拉选择列表
                if (isMask = false) {
                    var mask = document.createElement("div");
                    mask.style = `position:fixed;width:100%;height:100%;z-index:8888;`;
                    mask.id = 'mask';
                    mask.onmousedown = function () {
                        if (my$("dv")) {
                            my$("box").removeChild(my$("dv"));
                        }
                        if (my$("mask")) {
                            my$("box").removeChild(my$("mask"));
                        }
                    };
                    my$("box").appendChild(mask)
                    isMask = true;
                }
            })
复制代码

半个小时写出来的,功能上或有欠缺,还需要完善一下,这个看自己的业务逻辑的需要了。

有想了解更多的小伙伴可以加Q群链接里面看一下,希望能够对你们有所帮助。

相关文章

  • 基于jq搜素框,包含前端模糊查询,提示,点击选择等功能

    上图 上代码 html(不推荐这样写行内css,在此为了方便复制过来,看起来更直观) js,重点 仅提供思路,完全...

  • PHP聊天室实现

    基于PHP和Socket实现了基本的网页聊天室,以及上下线提示等功能。 项目地址:点击这里。 使用 本项目前端用W...

  • 查询功能点测试方法总结[转载]

    一、测试方法 查询类型包含单个查询、组合查询、输入框输入查询、时间控件查询四种场景: 1、功能实现 (1)支持模糊...

  • element-ui 的select下拉选择框,当切换选项时触发

    需求 select下拉选择框有一个默认选中的初始值,当我们切换选择的值时,弹出提示框,弹框包含取消和继续按钮,提示...

  • 工作中遇到的问题以及解决方法

    1.事件冒泡问题 问题描述:查询标签包含向下按钮图标,查询标签点击会触发出现loading,向下图标点击会触发绿框...

  • 产品细节

    全局说明 1 下拉框:读取数据的下拉框支持模糊查询 2 前端显示带图资讯时没有图片显示默认图片 **评论显示逻辑 ...

  • 提示框

    target:点击按钮---->屏幕中间弹出提示框 target:点击按钮---->屏幕底部弹出提示框

  • icop

    全局组件或配置 1. 表格查询页搜索框 点击reset或点击下拉选择框的清空按钮需要专为实体默认选中位置:src\...

  • Android点击输入框EditText时hint消失

    我们要实现当点击输入框时提示语hint消失的效果,简单查询发现需要使用OnFocusChangeListener ...

  • 前端模糊查询

    实现前端模糊查询效果 实验证明 这种方法可以达到模糊查询的效果,但是把搜索的字删了,数据也就没了,不能复原,应该要...

网友评论

      本文标题:基于jq搜素框,包含前端模糊查询,提示,点击选择等功能

      本文链接:https://www.haomeiwen.com/subject/tgqkrktx.html