原生JS+layui项目笔记(一)【layer弹出框与form、table】

 一、准备文件

1. html文件引入

<script type="text/javascript" src="./layui/layui.js"></script>

<script type="text/javascript" src="./xxx/xxxx.js"></script>

2.js文件引入layui的各种组件

layui.use(['jquery',layer','table','form','laytpl','laydate'],function(){
    var $ = layui.jquery;
    var layer = layui.layer;
    var form = layui.form;
    var table = layui.table;
    var laytpl = layui.laytpl;
    var laydate = layui.laydate;
    var upload = layui.upload;
})

二、layer弹出框

1.1 单一弹出框

layer.confirm('确定删除吗?',{
    skin:'m-pop-window',
    btnAlign:'c',
    shade:[0, 'transparent'],
    btn:['确定','删除'],
    btn1:function(index, layero){
        $.post('deleteUrl',{data:data},function(res){
            if(res.code == '0'){
            layer.msg('删除成功');
            layer.close(index);
            table.reload('table的id',{url:'',where:{}}) // 刷新表格
            }
        })
    }
    }
},
layer.msg('请输入名称后检索!');

1.2 layer内嵌表单(form+laydate+upload)

1.2.1 html中的form模板

写在htmlbody之外,写在script中,否则出现按钮失效。

<body>
    <button type="button" id="openLayer" class="layui-btn">开启弹窗</button>
</body>
<script id="addMappingBox">
    <div class="layui-form" layfilter="add_mining" id="add_mining">
        <div class="layui-form-item">
            <lable>名称1</lable>
            <!-- 一般输入框 -->
            <div class="layui-input-block">
                <input type="text" name="title" id="title1" class="layui-input" value={{d.title1}}/>
            </div>
        </div>
        <div class="layui-form-item">
            <lable>输入文本框</lable>
            <!-- 文本框 文本框插入值不能写在value中-->
            <div class="layui-input-block">
                <textarea type="text" name="title2" id="title2" class="layui-input">{{d.title2}}</textarea>
            </div>
        </div>
        <div class="layui-form-item">
            <lable>选择日期</lable>
            <!-- 日期-->
            <div class="layui-input-block">
                <input type="text" name="mapDate" id="mapDate" class="layui-input" value={{d.title3}}/>
            </div>
        </div>
        <div class="layui-form-item">
            <lable>上传文件</lable>
            <!-- 上传文件-->
            <div class="layui-input-block">
               <button type="button" id="uploadMindMapping" class="layui-btn">点击上传</button>
            <!-- 上传文件后回显文件名称-->
            <span id="uploadFileName"></span>
            </div>
        </div>
    </div>
</script>

1.2.2  js语法

触发弹窗:

//点击事件触发弹窗
$("#openLayer").click(function(){
    var addMappingWindow = laytpl(addMappingBox.innerHTML).render({
        <--!此处可利用name绑定value -->
        'title' :  $("#xxx").html();
        'title2' : $("#xxx").val();
    });
    layer.open({
        type:1,
        content:addMappingWindow,
        title:'弹窗的标题',
        skin:'m-pop-window',
        area:['700px','600px'],
        offset:'auto',
        btn:['确定','取消'],
        btnAlign:'c',
        resize:false,
        success: function(layero,index){
            form.render();  // 表单渲染
            initUploadMindMapping(); // 上传控件渲染
            
        },
        yes: function(layero, index){
            layer.close(index);
            return false; // 禁止layer自动刷新页面
        }
    })
});
// 时间控件
laydate.render({
    elem:'#mapDate',
    type:'datetime',
    format:'yyyy-MM-dd HH:mm:ss',
    change:function(value, date, endDate){
    }
});
// 上传控件
function initUploadMindMapping(){
    upload.render({
        elem:'#uploadMindMapping',
        bindAction:'.layui-layer-btn0',
        auto:false,
        url:'/uploadUrl',
        type:'post',
        accept:'file',
        exts:'xls|xlsx',  // 有时候限定‘file’后不限定明确类型会报'类型有问题'的错
        choose:function(obj){
            obj.preview(function(index, file, result){
                // 反显文件名
                $('#uploadFileName').html(file.name)
            })
        },
        done:function(res){
            
        }
    })
};

1.3 layer内嵌表格(form+table)

1.3.1  html模板(动态table)

<script id="organization_set" type="text/html">
    <div class="layui-form" lay-filter="">
        <div class="layui-form-item">
            <lable >复选框<lable>
            <div class="layui-input-block">
                <input type="checkbox" name="chooseIndex1" lay-filter="chooseIndex1" class="layui-input" title="按名称选" value="1" lay-skin="primary checked"/>
                <input type="checkbox" name="chooseIndex1" lay-filter="chooseIndex1" class="layui-input" title="按描述选" value="2" lay-skin="primary checked"/>
            </div>
        </div>
        <div class="layui-form-item">
            <lable >单选框<lable>
            <div class="layui-input-block">
                <input type="radio" name="chooseIndex2" lay-filter="chooseIndex2" class="layui-input" title="按名称选" value="0" lay-skin="primary checked"/>
                <input type="radio" name="chooseIndex2" lay-filter="chooseIndex2" class="layui-input" title="按描述选" value="1" lay-skin="primary checked"/>
            </div>
        </div>
        <div class="layui-form-item">
            <lable>筛选结果<lable>
            <div class="layui-input-block">
                <table id="resultTable" lay-filter="resultTable"></table>
            </div>
        </div>
    </div>
</script>

1.3.2  js语法(根据单选框、复选框内容刷新表格显示搜索结果)

var organizationChooseWindow = laytpl(organization_set.innerHTML).render({
});
layer.open({
    type:1,
    content:addMappingWindow,
    title:'弹窗的标题',
    skin:'m-pop-window',
    area:['700px','600px'],
    offset:'auto',
    btn:['确定','取消'],
    btnAlign:'c',
    resize:false,
    success: function(layero,index){
        form.render();  // 表单渲染
        // 未选择的时候 搜索结果显示(表格渲染)
        initSearchOrganizationTable();
        // 复选框内容监听
        form.on('checkbox(chooseIndex1)'),function(data){
            form.render('checkbox')
            // 全选
            if($('#organization_set_form input[type=checkbox]:checked').length == 2){
                table.reload('organizationSearchResult',{
                    where : {
                        organizationName:xxx,
                        describe:xxx
                    }
                })
            }else if($('#organization_set_form input[type=checkbox]:checked').val() == '1'){
                 table.reload('organizationSearchResult',{
                    where : {
                        organizationName:xxx
                    }
                })           
            }else if($('#organization_set_form input[type=checkbox]:checked').val() == '2'){
                 table.reload('organizationSearchResult',{
                    where : {
                        describe:xxx
                    }
                })           
            }
        };
        // 单选框内容监听
        form.on('radio(chooseIndex2)'),function(data){
            form.render('radio')
            if($('#organization_set_form input[type=radio]:checked').val() == '0'){
                table.reload('organizationSearchResult',{
                    where : {
                        organizationName:xxx
                    }
                })
            }else if($('#organization_set_form input[type=radio]:checked').val() == '1'){
                 table.reload('organizationSearchResult',{
                    where : {
                        describe:xxx
                    }
                })           
            }
        }
    },
    yes: function(layero, index){
        layer.close(index);
        return false; // 禁止layer自动刷新页面
    }
});
function initSearchOrganizationTable(){
// 带分页的table
    table.render({
        elem:'#organizationSearchResult',
        id:'organizationSearchResult',
        width: 470,
        height: 300,
        page:true,
        limit:50,
        method:'get',
        url:'linkUrl',
        where:{
            'taskId':xxx,
            'organization': xxx,
            'describe':xxxx
        },
        // 规范返回数据格式,格式不同渲染不出来
        parseData:function(res){
            return {
                'code':res.code,
                'msg':res.message,
                'data':res.data
            }
        },
        cols:[[
            {
                type:'checkbox',
                title:'',
                algin:'center'
            },
            {
                type:'radio',
                title:'',
                algin:'center'
            },
            {
                field:'organizationName',
                title:'名称',
                algin:'center',
                width: 80,
            },
            {
                field:'describe',
                title:'描述',
                algin:'center'
            }
        ]],
        // 渲染成功后的回调,可以修改table样式
        done:function(res){
            // 修改单元格padding,展示更多的内容
            $('.layui-table-cell').css('padding','0 2px')
        }
    })
};
// 获取复选框内容
var data_table = table.checkStatus('organizationSearchResult').data;

1.4 表格事件内嵌弹出框(table+layer+form  【单选框回显】)

1.4.1  html模板(动态table)

类似1.3.1插入一个table的容器

<body>
    <table id="WDmsgTable" lay-filter="WDmsgTable"></table>
</body>
<script id="consistency_set" type="text/html">
    <div class="layui-form" lay-filter="consistency_set_form" id="consistency_set_form">
        <div class="layui-form-item">
            <lable>机构名称</lable>
            <div class="layui-input-block">
                <input class="layui-input" name="organizationName" readonly value="{{d.organizationName}}"/>
            </div>
        </div>
        <div class="layui-form-item">
            <lable>时间</lable>
            <div class="layui-input-block">
                <input class="layui-input" name="consistencyTime" readonly value="{{d.consistencyTime}}"/>
            </div>
        </div>
        <div class="layui-form-item">
            <lable>正文</lable>
            <div class="layui-input-block">
                <textarea class="layui-input" name="consistencyContent" readonly value="">{{d.consistencyContent}}</textarea>
            </div>
        </div>
        <div class="layui-form-item">
            <lable>是否合规</lable>
            <div class="layui-input-block">
                <input type="radio" lay-filter="consistencyRadio" name="consistencyRadio" value="1" title="是" checked/>
                <input type="radio" lay-filter="consistencyRadio" name="consistencyRadio" value="0" title="否"/>
            </div>
        </div>
    </div>
</script>

1.4.2  js语法

//表格事件触发弹窗
table.render({
    elem:'#organizationSearchResult',
        id:'organizationSearchResult',
        width: 470,
        height: 300,
        page:true,
        limit:50,
        method:'get',
        url:'linkUrl',
        where:{
            'taskId':xxx,
            'organization': xxx,
            'describe':xxxx
        },
        // 规范返回数据格式,格式不同渲染不出来
        parseData:function(res){
            return {
                'code':res.code,
                'msg':res.message,
                'data':res.data
            }
        },
        cols:[[
            {
                type:'radio',
                title:'',
                algin:'center'
            },
            {
                field:'organizationName',
                title:'名称',
                algin:'center',
                width: 80,
            },
            {
                field:'describe',
                title:'描述',
                algin:'center'
            },
            {
                title:'操作',
                algin:'center',
                templet:function(d){
                    if(d.isComliance){
                        return '<a lay-event="check">是</a>'
                    }else{
                        return '<a lay-event="check">否</a>'
                    }
                }
            }
        ]],
});
table.on('tool(organizationSearchResult)',function(obj){
    var table_data = obj.data;
    var event = obj.event;
    var consistency_set_window = laytpl(consistency_set.innerHTML).render({
        <--!此处可利用name绑定value -->
        'organizationName' :  $('#searchOrganization').val()?'三元':'';
        'consistencyContent' : table_data.zj;
        'consistencyTime': table_data.sj;
    });
    if(event == 'check'){
        layer.open({
            type:1,
            content:consistency_set_window ,
            title:'弹窗的标题',
            skin:'m-pop-window',
            area:['700px','600px'],
            offset:'auto',
            btn:['确定','取消'],
            btnAlign:'c',
            resize:false,
            success: function(layero,index){
                form.render();  // 表单渲染
                //单选框回显
                $("input[name=consistencyName][value='1']").attr("checked",table_data.isComliance == '1'?true:'false);
                $("input[name=consistencyName][value='0']").attr("checked",table_data.isComliance == '0'?true:'false);
                //监听单选框变化,刷新单选框
                form.on('radio(consistencyRadio)',function(){
                    form.render('radio')
                });
            },
            yes:function(index, layero){
                //上传数据,刷新表格
                $.get('url',{isComliance : $("input[name=consistencyName]:checked").val()},function(res){
                    if(res.code == '0'){
                        table.reload('WDmsgTable',true)
                    }
                })
                layer.close(index);
                return false;
            },
        })
          
    }
})