• Layui 踩坑记录


    layui 主页面与弹窗之间父子页面值传递

    弹窗为 iframe 类型

    父页面向子页面传递值:

    // 查看
    function lookUp(that) {
        layer.open({
            type: 2,
            area: ['700px', '450px'],
            fixed: false, //不固定
            maxmin: true,
            title: '当前线路',
            content: '/app/v1/lines/',
            success: function (layero, index) {
                var account_name = that.name;
                $.ajax({
                    url: '/app/v1/lookup/?account_name=' + account_name,
                    type: 'get',
                    contentType: "application/json",
                    dataType: "json",
                    async: false,
                    headers: {
                        "X-CSRFToken": getCookie("csrftoken")
                    },
    
                    success: function (resp) {
                        var body = layer.getChildFrame('body', index);      // 确认两个页面间父子关系
                        var iframeWin = window[layero.find('iframe')[0]['name']];   // 子页面对象
                        var tbody_elem = body.find('tbody');       // 寻找子页面 tbody 元素
                        for (j = 0, len = resp.length; j < len; j++) {
                            var data = resp[j];
                            if (data) {
                                $(tbody_elem).append("<tr><td>" + data+ "</td></tr>");
                            }
                        }
                    }
                })
            }
        });
    }
    

    弹窗类型为普通弹窗

    此类型 type 为 1,弹窗 html 页面元素在当前上面,上面 iframe 为两个页面,因此可直接修改弹窗中元素。

    1、html

    <form class="layui-form" onsubmit="return false;" id="change_name" style="display: none">
        <div class="layui-form-item">
            <div class="layui-input-block">
                <input type="text" name="title" required lay-verify="required" placeholder="输入新密码"
                        autocomplete="off" class="layui-input" style="margin-left: -50px;margin-top: 20px;"
                        id="new_name">
            </div>
        </div>
    </form>
    

    2、表格渲染:

    layui.use(['table', 'form'], function () {
        var table = layui.table;
        var form = layui.form;
        form.render();
    
        // 表格渲染
        table.render({
            elem: '#dtbList',
            id: 'Reload',
            height: 612,
            url: '/system/route/list/',
            method: 'get',
            page: true,
            cols: [[
                {
                    field: 'name',
                    title: '路由器名称',
                     160,
                    fixed: 'left',
                    // 点击触发弹窗
                    templet: function (d) {
                        return '<a href="javascript:void(0)" class="layui-table-link" onclick="changeName(this)" mac=' + d.mac + '>' + d.name + '</a>'
                    }
                }
                , {field: 'mac', title: 'Mac 地址',  160, sort: true}
                , {field: 'status', title: '状态',  100}
                , {field: 'type', title: '类型',  100}
                , {field: 'version', title: '版本',  100}
                , {field: 'server', title: '绑定服务器',  160}
                , {field: 'tunnel', title: '通道',  120, sort: true}
                , {field: 'bind_time', title: '绑定时间',  180, sort: true}
                , {field: '操作',  165, align: 'center', toolbar: '#barDemo'}
            ]
            ],
        });
    
    });
    

    3、JS

    function changeName(that) {
        var mac_addr = $(that).attr('mac');
        var mac_name = $(that).text();
    
        // 获取弹窗 input 元素
        $('#new_name').val(mac_name);
        layer.open({
            type: 1,
            area: ['300px', '180px'],
            maxmin: false,  // 禁止放大、全屏
            fixed: false,
            resize: false,  // 禁止拉伸
            title: '修改名称',
            content: $("#change_name"),
            btn: ['提交', '取消'],
            btn1: function (index, layero) {
                var new_name = $('#new_name').val();
                console.log(new_name, new_name.length);
                if (new_name.length === 0) {
                    layer.alert('名称不能为空', {icon: 5});
                    return false;
                } else if (new_name.length >=15 || new_name.length < 5) {
                    layer.alert('名称长度 5-15个字符');
                    return false;
                } else {
                    $.ajax({
                        url: ["{% url 'system:route-name-update' %}" + '?new_name=' + new_name + '&mac_addr=' + mac_addr + '&name=' + mac_name],
                        type: 'get',
                        cache: false,
                        success: function (resp) {
                            if (resp.code === 0) {
                                layer.alert(resp.msg, {icon: 1}, function (index) {
                                    parent.layer.closeAll(); // 关闭所有弹窗
                                    $(that).text(new_name);
                                });
    
                            } else {
                                layer.alert(resp.msg, {icon: 5});
                            }
                        }
    
                    })
                }
    
            },
            btn2: function (index, layero) {
                layer.closeAll();
            }
    
        });
    }
    

    父界面向子界面传值

    1、父界面:

    function show_layer(){
    layer.open({
            type: 2,
            area: [w+'px', h +'px'],
            fix: false, //不固定
            maxmin: true,
            shadeClose: true,
            shade:0.4,
            title: title,
            content: url,  //url 为子布局的url路径
            success:function (layero,index) {
                    var iframe = window['layui-layer-iframe' + index];
                    iframe.child('我是父布局传到子布局的值')
            }
        });
    }
    

    2、子界面:

    function child(obj){
        console.log(obj);//获取父界面的传值
    }
    

    子界面向父界面传值

    1、子界面:

    parent.GetValue('我是子界面的数值'); //GetValue是父界面的Js 方法
    var index = parent.layer.getFrameIndex(window.name);
    parent.layer.close(index);
    

    2、父界面:

    function GetValue(obj){
        console.log(obj);
    }
    

    参考文章:https://www.cnblogs.com/yysbolg/p/9977387.html

    layui 下拉框是隐藏的

    需要使用 js 渲染下:

    layui.use('form', function () {
            var form = layui.form;
            form.render();
        })
    

    layui 表格过滤并重新渲染

    逻辑:前端提供过滤框,将过滤条件发送到后台过滤,请求成功后,重新渲染表格内容。

    1、表格和过滤部分 HTML 内容:

    <div class="box-body">
        {% csrf_token %}
        <!-- 过滤 -->
        <div class="demoTable" style="margin-bottom: 20px;">
            <label style="font-weight: 500;!important;">路由器名称:</label>
            <div class="layui-inline">
                <input class="layui-input" name="mac_name" id="mac_name" autocomplete="off">
            </div>
    
            <label style="margin-left: 30px;font-weight: 500;!important;">路由器 Mac:</label>
            <div class="layui-inline">
                <input class="layui-input" name="mac_addr" id="mac_addr" autocomplete="off">
            </div>
    
            <label style="margin-left: 30px;font-weight: 500;!important;">绑定服务器:</label>
            <div class="layui-inline">
                <input class="layui-input" name="server" id="server" autocomplete="off">
            </div>
            <button class="layui-btn" data-type="getInfo" id="filter">搜索</button>
        </div>
    
        <!-- 表格 -->
        <table id="dtbList" lay-filter="test" class="display" cellspacing="0" width="100%">
    
        </table>
    
        <!-- 表格操作 -->
        <script type="text/html" id="barDemo">
            <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="bind">绑定</a>
            <a class="layui-btn layui-btn-xs" lay-event="unbind">解绑</a>
            <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
        </script>
    </div>
    

    2、表格渲染:

    向后台发送 ajax 请求,获取数据并渲染:

    layui.use(['table', 'form'], function () {
        var table = layui.table;
        var form = layui.form;
        form.render();
    
        // 表格渲染
        table.render({
            elem: '#dtbList',
            id: 'Reload',
            height: 612,
            url: '/system/route/list/',
            method: 'get',
            page: true,
            cols: [[
                {
                    field: 'name',
                    title: '路由器名称',
                     160,
                    fixed: 'left',
                    templet: function (d) {
                        return '<a href="javascript:void(0)" class="layui-table-link" onclick="changeName(this)" mac=' + d.mac + '>' + d.name + '</a>'
                    }
                }
                , {field: 'mac', title: 'Mac 地址',  160, sort: true}
                , {field: 'status', title: '状态',  100}
                , {field: 'type', title: '类型',  100}
                , {field: 'version', title: '版本',  100}
                , {field: 'server', title: '绑定服务器',  160}
                , {field: 'tunnel', title: '通道',  120, sort: true}
                , {field: 'bind_time', title: '绑定时间',  180, sort: true}
                , {field: '操作',  165, align: 'center', toolbar: '#barDemo'}
            ]
            ],
        });
    });
    

    3、过滤:

    搜索按钮绑定 click() 事件,获取过滤条件,然后发送请求,请求成功重新 reload 表格数据:

     // 过滤
    $('#filter').click(function () {
        var mac_name = $('#mac_name').val();
        var mac_addr = $('#mac_addr').val();
        var server = $('#server').val();
        table.reload('Reload', {
            // where 为发送到后台的数据
            where: {
                'mac_name': mac_name,
                'mac_addr': mac_addr,
                'server': server
            }
        })
    })
    

    这里并没有单独发送 ajax 请求,而是使用 table 渲染时的请求,只是额外地添加了过滤参数。

    注意:过滤条件,若包裹在 form 表单,需要禁止 form 自身的提交 onsubmit="return false;"

    将单元格渲染为 a 标签

    若想将哪个单元格渲染 a 标签,可以使用 templet 参数绑定模板,插件本身提供三种方法,这是第二种:函数转义

     table.render({
        elem: '#dtbList',
        id: 'Reload',
        height: 612,
        url: '/system/route/list/',
        method: 'get',
        page: true,
        cols: [[
            {
                field: 'name',
                title: '路由器名称',
                 160,
                fixed: 'left',
                templet: function (d) {
                    return '<a href="javascript:void(0)" class="layui-table-link" onclick="changeName(this)" mac=' + d.mac + '>' + d.name + '</a>'
                }
            }
            , {field: 'mac', title: 'Mac 地址',  160, toolbar: '#barDemo'}
        ]
        ],
    });
    

    详细可参考:https://www.layui.com/doc/modules/table.html#templet

    注意:启动 d 为当前行数据

    layer alert 类型

    layer.alert('确定删除吗?', {
            title: '提示'
            , icon: 3 //0:感叹号 1:对号 2:差号 3:问号 4:小锁 5:哭脸 6:笑脸
            , time: 0 //不自动关闭
            , btn: ['YES', 'NO']
            , yes: function (index) {
                layer.close(index);
                $.ajax({
                    type: "POST",
                    url: "{% url 'system:rbac-role-delete' %}",
                    data: {"id": id, csrfmiddlewaretoken: '{{ csrf_token }}'},
                    cache: false,
                    success: function (msg) {
                        if (msg.result) {
                            layer.alert('删除成功', {icon: 1});
                            oDataTable.ajax.reload();
                        } else {
                            //alert(msg.message);
                            layer.alert('删除失败', {icon: 2});
                        }
                        return;
                    }
                });
            }
        });
    

    layui 弹出输入框

    1、html

    默认隐藏,否则当前页码会显示:

    <form class="layui-form" onsubmit="return false;" id="change_name" style="display: none">
        <div class="layui-form-item">
            <div class="layui-input-block">
                <input type="text" name="title" required lay-verify="required" placeholder="输入新密码"
                        autocomplete="off" class="layui-input" style="margin-left: -50px;margin-top: 20px;"
                        id="new_name">
            </div>
        </div>
    </form>
    

    2、js

    content 参数绑定 form 表单 id

    layer.open({
        type: 1,    // 类型 为 1
        area: ['300px', '180px'],
        maxmin: false,  // 禁止放大、全屏
        fixed: false,
        resize: false,  // 禁止拉伸
        title: '修改名称',
        content: $("#change_name"),
        btn: ['提交', '取消'],
        // 提交按钮
        btn1: function (index, layero) {
            $.ajax({
                url: ["{% url 'system:route-name-update' %}" + '?new_name=' + new_name + '&mac_addr=' + mac_addr + '&name=' + mac_name],
                type: 'get',
                cache: false,
                success: function (resp) {
                    if (resp.code === 0) {
                        layer.alert(resp.msg, {icon: 1}, function (index) {
                            parent.layer.closeAll(); // 关闭所有弹窗
                            $(that).text(new_name);
                        });
    
                    } else {
                        layer.alert(resp.msg, {icon: 5});
                    }
                }
    
            })
        },
        // 取消按钮
        btn2: function (index, layero) {
            layer.closeAll();
        }
    
    });
    

    layui 表单自定义验证规则

     <div class="layui-form-item">
        <label class="layui-form-label">账户创建数量</label>
        <div class="layui-input-block">
            <input type="text" name="account_num" required lay-verify="required|number|account_num"
                    autocomplete="off" class="layui-input">
        </div>
    </div>
    

    js

    layui.use(['form', 'laydate'], function () {
        var form = layui.form
            , laydate = layui.laydate;
    
        // 表单验证
        form.verify({
            // 对应 input 的 lay-verify 属性
            account_num: function (value) {
                if (parseInt(value) > 1000 || parseInt(value) === 0) {
                    return "账户数量不能超过1000或不能为0";
                } else if (parseInt(value) < 0) {
                    return "账户数量不能为负数";
                }
            }
        });
    
    });
    

    以上用到的内置验证规则规则有:required、number,分别用来判断 input 是否为空、数字;当内置的规则不够用时,就可以考虑使用自定义规则了。

    内置验证规则:https://blog.csdn.net/qq_35393869/article/details/86627689

    注意:input 表单元素必须有 lay-verify 属性,有多个验证规则的话,用 | 隔开

    layui 表单监听 radio

    <div class="layui-inline">
        <label class="layui-form-label">过期时间</label>
        <div class="layui-input-block">
            <input type="text" name="date" id="date" lay-verify="date" placeholder="yyyy-MM-dd"
                    autocomplete="off" class="layui-input">
        </div>
        <div class="layui-input-block">
            <input type="radio" name="expire_time" lay-filter="expire_time" num="1" value="1个月"
                    title="1个月">
            <input type="radio" name="expire_time" lay-filter="expire_time" num="3" value="3个月"
                    title="3个月" checked>
            <input type="radio" name="expire_time" lay-filter="expire_time" num="6" value="半年"
                    title="半年" checked>
        </div>
    </div>
    
    

    js

    // 监听单选框:过期时间
    form.on('radio(expire_time)', function (data) {
        var now_timer = new Date();
        var num = $(data.elem).attr('num');
        now_timer.setMonth(now_timer.getMonth() + parseInt(num));
        var change_time = '' + now_timer.getFullYear() + '-' + (now_timer.getMonth() + 1) + '-' + now_timer.getDate() + '';
        $('#date').val(change_time);
    });
    
    

    注意:需要指定 lay-filter

    layui 表单验证日期且不许选择之前的日期

    <div class="layui-inline">
        <label class="layui-form-label">过期时间</label>
        <div class="layui-input-block">
            <input type="text" name="date" id="date" lay-verify="date" placeholder="yyyy-MM-dd"
                    autocomplete="off" class="layui-input">
        </div>
        <div class="layui-input-block">
            <input type="radio" name="expire_time" lay-filter="expire_time" num="1" value="1个月"
                    title="1个月">
            <input type="radio" name="expire_time" lay-filter="expire_time" num="3" value="3个月"
                    title="3个月" checked>
            <input type="radio" name="expire_time" lay-filter="expire_time" num="6" value="半年"
                    title="半年" checked>
        </div>
    </div>
    
    

    js

    layui.use(['form', 'laydate'], function () {
        var form = layui.form
            , laydate = layui.laydate;
    
        // 日期
        var date = new Date();
        var now_time = '' + date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + '';
        laydate.render({
            elem: '#date',
            min: now_time   // 最小不能小于今天,即今天之前的日期不能选择
        });
    
    })
    
    
  • 相关阅读:
    【Kubernetes学习笔记】-kubeadm 手动搭建kubernetes 集群
    教你快速搭建NFS服务
    【Kubernetes学习笔记】-服务访问之 IP & Port & Endpoint 辨析
    【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境
    Linux RDP 会话中无法打开VSCode 解决办法
    Jenkins 凭证管理
    linux 后台运行进程:& , nohup
    使用私有gitlab搭建gitbook持续集成
    VS Code 使用
    Markdown Rules 详解
  • 原文地址:https://www.cnblogs.com/midworld/p/13610947.html
Copyright © 2020-2023  润新知