layui table动态增加行以及通过键盘定位指定单元格

版权声明:请勿用于任何商业用途的文章转载,转载请说明出处!

 效果图:

 

业务需求:

1.入库单等此类单据表单,明细数据需要动态行。

2.光标需要定位到新增加行的指定单元格。

3.单元格填入数据后按回车,光标移动到下个可编辑的单元格;如果已经是最后一个单元格,那么光标移动到下一行的指定单元格;如果是最后一行的最后单元格,那么再次新增行

附:键值表

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../layuiadmin/style/admin.css" media="all">
    <script src="../../jquery-3.3.1.js"></script>
    <script src="../layuiadmin/layui/layui.js"></script>
    <script>
        layui.config({
            base: '../layuiadmin/' //静态资源所在路径
        }).extend({
            index: 'lib/index' //主入口模块
        }).use(['index','form','laydate', 'table'] , function () {
            var admin = layui.admin
                ,element = layui.element
                ,laydate = layui.laydate
                ,table = layui.table
                ,form = layui.form;

            element.render();

            let entityName = 'ordBill'
                ,tableId = entityName + "-table-operate"
                ,cols = [
                [
                    {field:'id', title: 'ID', sort: true, hide:true, fixed: 'left'}
                    ,{field:'barcode', sort:true , title: '条码' , edit:true}
                    ,{field:'code', sort:true , title: '商品代码' , edit:true}
                    ,{field:'name', sort:true , title: '商品名称' }
                    ,{field:'spec', sort:true , title: '单位'}
                    ,{field:'unit', sort:true , title: '包装单位'}
                    ,{field:'qpcStr', sort:true , title: '包装规格' , edit:true}
                ]
            ];


            $(document).ready(function () {
                // tableData:模拟接收到后端传入的table数据
                // *****重点:不要使用url方式渲染table,否则无法通过数据重载的方式,增加新的数据行
                let tableData = [{
                    "id":"0"
                    ,"code":"0"
                    ,"barcode":"0"
                    ,"name":"第0条数据"
                    ,"spec":""
                    ,"unit":""
                    ,"qpcStr":"0"
                }];
                table.render({
                    elem: '#' + tableId
                    ,data:tableData
                    ,cols:cols
                    ,page:false
                });
                // 
                tableAddRow(table , tableId ,{
                    "id":""
                    ,"code":""
                    ,"barcode":""
                    ,"name":""
                    ,"spec":""
                    ,"unit":""
                    ,"qpcStr":""
                } , 10 , true , 'barcode');
            });

            /**
             *  监听键盘事件
             */
            $(document).on('keyup' , '.layui-input' , function (event) {
                let td = $(this).parent('td');
                let tr = td.parent('tr');
                let dataIndex = $(tr).attr("data-index");
                switch (event.keyCode) {
                    // case 13:13表示回车
                    case 13:
                        let data_field = $(td).attr("data-field");
                        let tableDataLength = table.cache[tableId].length;
                        if (data_field == 'qpcStr') {
                            //如果当前处于最后一行,那么自动新增N行
                            if (dataIndex == tableDataLength - 1){
                                tableAddRow(table , tableId , {
                                    "id":""
                                    ,"code":""
                                    ,"barcode":""
                                    ,"name":""
                                    ,"spec":""
                                    ,"unit":""
                                    ,"qpcStr":""
                                } , 10 , true , 'barcode');
                            }else {
                                // 下移一行,光标焦点移动到barcode处
                                tr['next']().children('td').eq(1).click();
                            }
                        }
                        td['nextAll']('[data-edit="true"]:first').click();
                        break;
                }
            });

            /**
             * 给table动态增加空白行
             * @param table
             * @param tableId
             * @param templateData      数据模板
             * @param rowCount          增加的行数    
             * @param isClick           是否触发鼠标单击事件
             * @param clickFieldName    需要单击的field名称,需要isClick = true,并且该列为可编辑
             */
            function tableAddRow(table , tableId , templateData , rowCount , isClick , clickFieldName) {
                let sourceData = table.cache[tableId];
                let dataIndex = sourceData.length;
                for (let i = dataIndex; i < (dataIndex + rowCount); i++) {
                    let tempData = {
                        LAY_TABLE_INDEX:i
                    };
                    $.extend(tempData , templateData);
                    sourceData.push(tempData);
                }
                table.reload(tableId , {
                    data:sourceData
                    ,limit:sourceData.length
                });
                // 是否自动触发鼠标单击事件
                if (isClick == true){
                    tableColClick(tableId , dataIndex , clickFieldName);
                }

            };

            /**
             * table中的可编辑单元格自动触发单击事件
             * @param tableId       table的ID
             * @param dataIndex     行号
             * @param clickName     点击字段名称
             */
            function tableColClick(tableId , dataIndex , clickFieldName){
                let trs = $("#" + tableId).next().find(".layui-table-main").find("table tbody tr");
                if (trs.length > 0){
                    $.each(trs , function (index , value) {
                        let dataId = $(value).attr("data-index");
                        if (dataId == dataIndex){
                            let tds = $(value).find("td");
                            $.each(tds , function (i , v) {
                                let data_field = $(v).attr("data-field");
                                if (data_field == clickFieldName){
                                    v.click();
                                }
                            })
                        }
                    });
                }
            }

        });
    </script>

</head>
<body>
<div class="layui-card-body">
    <table class="layui-hide" id="ordBill-table-operate" lay-filter="ordBill-table-operate"></table>

</div>
</body>
</html>

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值