基于layui模块的后台匹配搜索框

  最近做了一个项目,其中需要从大量数据中筛选出需要的相应数据,因为数据量庞大,且变化,因此不能一次性渲染至前端页面,所以只能通过输入关键字,后台获取关键字搜索匹配返回数据给前端的方法,然后在网上大量寻找,始终找不到能完美融合项目的插件,于是萌发了自己写一个的想法,晚辈学疏才浅,望指教!

下面开始进入正题

前端部分

本想自己设计样式,但审美受限,感觉与整体项目风格不符,于是直接采用layui模块的样式

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<link rel="stylesheet" href={% static ‘layui-v2.4.3/layui/css/layui.css‘ %}>
<style>
    .select_a {
        color: #009688;
        padding: 2px;
        margin: 2px;
        border: #009688 1px dashed;
    }
</style>
<body>
{% csrf_token %}
<div class=" layui-col-md4">
    <label class="layui-form-label">单选搜索</label>
    <div class="layui-input-block" name="single_select">
        <div class="layui-form-select" style="width: 200px">
            <div class="layui-select-title">
                <input type="text" class="layui-input" placeholder="请输入单位名称"
                       name="select_input" autocomplete="off" id="">
                <i class="layui-edge"></i>
            </div>
            <dl name="select_show" class="layui-anim layui-anim-upbit">
                <dd lay-value="" class="layui-select-tips" style="text-align: center">
                    <i class="layui-icon layui-icon-loading layui-icon layui-anim layui-anim-rotate layui-anim-loop"></i>
                </dd>
            </dl>
        </div>
    </div>
</div>
<div class=" layui-col-md4">
    <label class="layui-form-label">多选搜索</label>
    <div class="layui-input-block" name="multiple_select">
        <div class="layui-form-select">
            <div class="layui-select-title">
                <div style="display: inline-block;position: absolute;left:4px;height: 38px;line-height: 38px">
                </div>
                <input type="text" class="layui-input" placeholder="请输入单位名称"
                       name="select_input" autocomplete="off" id="">
                <i class="layui-edge"></i>
            </div>
            <dl name="select_show" class="layui-anim layui-anim-upbit">
                <dd lay-value="" class="layui-select-tips" style="text-align: center">
                    <i class="layui-icon layui-icon-loading layui-icon layui-anim layui-anim-rotate layui-anim-loop"></i>
                </dd>
            </dl>
        </div>
    </div>
</div>
</body>
<script type="text/javascript" src={% static ‘jquery-3.3.1.min.js‘ %}></script>
<script type="text/javascript" src={% static ‘layui-v2.4.3/layui/layui.js‘ %}></script>
<script>
    layui.use([‘layer‘, ‘element‘, ‘form‘], function () {
        var element = layui.element;
        var layer = layui.layer;
        var form = layui.form;

        //select自适应
        function select_adaption(select_input) {
            var div_width = select_input.prev().outerWidth(true)
            select_input.css(‘padding-left‘, (parseInt(div_width) + 6) + ‘px‘)
            select_input.val(‘‘)
        }

        //select模糊搜索
        function vagueselect(obj, type) {
            var select_input = obj.find(‘[name="select_input"]‘)
            var select_show = obj.find(‘[name="select_show"]‘)

            function getdataList() {
                var parms = new Object();
                parms["keyword"] = select_input.val();
                parms["csrfmiddlewaretoken"] = $("[name = ‘csrfmiddlewaretoken‘]").val()
                $.ajax({
                    cache: true,
                    type: "POST",
                    url: ‘/test/‘,
                    data: parms,
                    async: false,
                    success: function (data) {
                        var json = $.parseJSON(data);
                        var html
                        if (type == ‘multiple‘) {
                            select_input.prev().children().each(function () {
                                for (var i = 0; i < json.data_list.length; i++) {
                                    if (json.data_list[i].ID == $(this).attr(‘belong_id‘)) {
                                        //删除已选选项
                                        json.data_list.splice(i, 1)
                                    }
                                }
                            })
                        }
                        if (json.data_list.length > 0) {
                            //将获得的数据填充到下拉的数据框里
                            select_show.children().first().hide().nextAll().remove()
                            for (var i = 0; i < json.data_list.length; i++) {
                                html = ‘<dd lay-value="‘ + json.data_list[i].ID + ‘" class="">‘ + json.data_list[i].Name + ‘</dd>‘;
                                select_show.append(html)
                            }
                        }
                        else {
                            if (parms["keyword"].length > 0) {
                                //如果为搜索到匹配项显示
                                select_show.children().first().hide().nextAll().remove()
                                html = ‘<dd lay-value="无" class="layui-select-tips">无该匹配项</dd>‘;
                                select_show.append(html)
                            }
                            else {
                                //如果未输入关键字复原样式
                                select_show.children().first().show().nextAll().remove()
                            }
                        }
                    },
                    error: function (request) {
                        layer.msg("Connection error", {icon: 2});
                    }
                });
            }

            //输入框聚焦事件
            select_input.focus(function () {
                obj.find(‘.layui-form-select‘).addClass(‘layui-form-selected‘)
                getdataList()
            })
            //输入框失去焦点事件
            select_input.blur(function () {
                var input_dom = this
                $(document).on(‘click‘, function (event) {
                    var dom = select_show[0]
                    if (event.target !== input_dom && event.target !== dom) {
                        obj.find(‘.layui-form-select‘).removeClass(‘layui-form-selected‘)
                    }
                })
            })
            //当案件松开时
            select_input.keyup(function () {
                getdataList()
            })
            if (type == ‘single‘) {
                obj.delegate(‘dd‘, ‘click‘, function () {
                    if ($(this).index() > 0) {
                        $(this).siblings().removeClass(‘layui-this‘)
                        $(this).addClass(‘layui-this‘)
                        select_input.val($(this).text())
                        select_input.attr(‘id‘, $(this).attr(‘lay-value‘))
                        obj.find(‘.layui-form-select‘).removeClass(‘layui-form-selected‘)
                    }
                });
            }
            else if (type == ‘multiple‘) {
                //为选择项绑定点击事件
                obj.delegate(‘dd‘, ‘click‘, function () {
                    if ($(this).index() > 0 && $(this).text() !== ‘无该匹配项‘) {
                        $(this).siblings().removeClass(‘layui-this‘)
                        $(this).addClass(‘layui-this‘)
                        var temp = ‘<a class="select_a" belong_id="‘ + $(this).attr(‘lay-value‘) + ‘" ><i class="layui-icon" style="cursor: pointer;" name="select_del">?</i>‘ + $(this).text() + ‘</a>‘
                        console.log(temp)
                        select_input.prev().append(temp)
                        console.log(select_input.prev())
                        select_adaption(select_input)
                        obj.find(‘.layui-form-select‘).removeClass(‘layui-form-selected‘)
                        obj.parent().parent().next().find(‘input‘).attr(‘disabled‘, false)
                        obj.parent().parent().next().find(‘select‘).attr(‘disabled‘, false)
                        form.render()
                    }
                });
            }
        }

        //删除选项统一接口
        $(‘body‘).delegate(‘[name="select_del"]‘, ‘click‘, function () {
            var select_input = $(this).parent().parent().next()
            if ($(this).parent().siblings().length == 0) {
                $(this).parents(‘:eq(5)‘).nextAll().find(‘input‘).attr(‘disabled‘, true)
                $(this).parents(‘:eq(6)‘).next().find(‘input‘).attr(‘disabled‘, true)
                $(this).parents(‘:eq(6)‘).next().find(‘select‘).attr(‘disabled‘, true)
                form.render()
            }
            $(this).parent().remove()
            select_adaption(select_input)
        });

        vagueselect($(‘[name="single_select"]‘), ‘single‘)
        vagueselect($(‘[name="multiple_select"]‘), ‘multiple‘)
    });

</script>
</html>

后台部分使用python编写(django)

def test(request):
    data_list = []
    return_dict = {‘code‘: 0, ‘data_list‘: data_list}
    res_dict = request.POST.dict()
    keyword = res_dict[‘keyword‘]
    if keyword:
            company_obj = models.S_Company.objects.all().filter(C_Astatus=2).exclude(
                C_Status__in=[-1, 0]).filter(
                Q(C_Name__icontains=keyword) | Q(C_SName__icontains=keyword)
            ).values(‘C_ID‘, ‘C_Name‘).order_by("C_Name")
            for index, company in enumerate(company_obj):
                data_list.append({})
                data_list[index][‘ID‘] = company[‘C_ID‘]
                data_list[index][‘Name‘] = company[‘C_Name‘]
            return_dict[‘data_list‘] = data_list
    return HttpResponse(json.dumps(return_dict))

效果如下:

单选

多选

注:如需引用,请注意HTML格式!!!

原文地址:https://www.cnblogs.com/kxsph/p/10344091.html

时间: 2024-08-30 01:46:04

基于layui模块的后台匹配搜索框的相关文章

html5 模糊匹配搜索框

使用bootstrap3-typeahead.js 文件在这里 引用: <script type="text/javascript" src="@Url.Content("XXXXX/bootstrap3-typeahead.js")" charset="UTF-8"></script> input控件 <input id="local_data" autocomplete=&

搜索框关键字智能匹配实例代码实例

搜索框关键字智能匹配实例代码实例:只要使用搜索引擎的朋友应该都有这样的体会,就是当在搜索框输入关键字的时候,会出现自能匹配现象,这绝对是非常好的用户体验,下面就是一段类似的代码,当然这里只是掩饰,所以只能匹配的数据都是本地固定好的,在实际应用中可以才能够数据库读取数据.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="auth

7款基于jquery的动画搜索框

无论是电商网站,还是媒体网,还是个人博客,每个网站都有属于自己个性化的搜索框.今天小编给大家带来7款基于jquery的动画搜索框.每个搜索框都采用了动画效果,一起看下效果图吧. 在线预览   源码下载 实现的代码. html代码: <h1> CSS Animated Search Boxes</h1> <p> (with occasional help from javascript to assign focus)</p> <div class=&q

Android零基础入门第62节:搜索框组件SearchView

原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当用户输入完成后提交搜索时,也可通过监听器执行实际的搜索. SearchView默认是展示一个search的icon,点击icon展开搜索框,也可以自己设定图标.用SearchView时可指定如下表所示的常见XML属性及相关方法. 如果为SearchView增加一个配套的ListView,则可以为Se

Jquery实现类似百度的搜索框

最近工作中需要做一个搜索框,类似百度的搜索框,需要达到两个功能: 1.输入关键字,展示匹配的下拉列表 2.选择匹配的项后查出相关内容 一般电商网站中也经常用到该搜索条,首先分析功能实现,输入关键字马上显示匹配项列表,实现该功能输入框需要绑定"input"事件,然后向后台发送异步请求,将数据展示在页面上.使用鼠标或上下键选择匹配项,点击搜索或"Enter"键后搜索具体结果.这里要用到两个异步请求,第一个请求匹配项,第二个请求搜索结果.键盘,鼠标以及输入框的事件都要监听

java简单的实现搜索框的下拉显示相关搜索功能

最近做了一个简单的搜索框下面下拉显示相关搜索的功能,有点模仿百度的下拉展示相关搜索 先上个展示图 : 点击进入演示地址,大家可以输入长点的搜索,点击搜索,再输入之前搜索词的前面部分,看是否能展示出来 搜索框相关搜索的展示很简单,就是根据你的搜索词,去数据库中匹配,是否有类似的搜索词存在,按照搜索词被搜索的次数进行排序显示出来 我设计的是每次搜索一个词,提交之后都会去数据库进行查询,看是否存在这个搜索词的搜索,若存在,则对数据库中的这个搜索词对象进行次数加1,不存在,则创建这个新搜索词对象,保存在

原生JS模拟百度搜索框

近期有个新入行的小伙伴一直在问一些基础知识,突然觉得人的记忆力有限,有些平常很少用到的知识点虽简单却也其实很容易模糊,或者是一个单词,或者是一个语法.所以想着应该利用一下工作之余的碎片时间,记录一些工作上的问题和一些有趣的小案例,于是开通了播客,一方面便于自己日后翻阅,一方面给刚学习的小伙伴一个参考. 今天先写一个简单的小案例:原生JS模拟百度搜索框. 需求: 1.当在输入框输入时,每输入一个文字,就会在下方展示相关内容列表 2.每一次输入框输入,清空上一次内容 3.鼠标移入列表内容时,对应的内

转-搜索框的测试方法(备忘)

若查询条件为输入框,则参考输入框对应类型的TEST方法 一.功能实现: 1.搜索按钮功能是否实现: 2.点搜索后,原先的搜索条件是否清空: 3.注意验证搜索框的功能是否与需求一致,即是模糊搜索,还是完全搜索.如果支持模糊查询,搜索名称中任意一个字符,要能搜索到:如果支持完全搜索,点击“搜索”,查询结果正确:中%国,查询结果是不是都包含中国两个字的信息 4.比较长的名称是否能查到,输入过长查询数据,看其有没判断,报错;系统是否会截取允许的长度来检索结果;只能输入允许的字符串长度? 5.空;默认查询

Fastadmin 如何引入 layui 模块

FastAdmin,PHP,Fastadmin引入layui模,fastadmin使用layui. FastAdmin基于RequireJS进行前端JS模块的管理,因此如果我们需要再引入第三方JS插件,则必按照RequireJS的规则进行载入.如果你还不了解什么是RequireJS,可以先简单了解下RequireJS,相关链接:http://www.ruanyifeng.com/blog/2012/11/require_js.html FasrAdmin 前台文件在 require-fronte