美文网首页
原生JS实现不固定行和列的表格

原生JS实现不固定行和列的表格

作者: 坏丶毛病 | 来源:发表于2020-08-31 11:33 被阅读0次

之前有个需求,就是需要一个不固定行和列的表格,第一行的所有列的标题内容,用来表示数据对象中的key,而表格中的其他行,分别显示对应key的value。

起始显示一行一列的表格th,然后根据用户是否输入值,动态增加行和列,每次根据倒数第二行是否有值,以此来判断是否要新增行,每次根据倒是第二列是否有值,以此来判断是否要新增列,然后根据行和列的值是否清空,以此来判断是否要删除行和列。

代码部分:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        html,body{
            width: 100%;
            height: 100%;
        }
        table{
            border-collapse:collapse;
            background: #fff;
        }
        tr{
            height: 50px;
        }
        td{
            width: 300px;
            height: 100px;
            background: #f60;
            border-right: 1px solid #000;
        }
        input{
            width: 100%;
            height: 100%;
            font-size: 30px;
            background: lightblue;
            outline: none;
        }
    </style>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>
                    <input type="text" placeholder="请输入标题">
                </th>
            </tr>
        </thead>

        <tbody>

        </tbody>
    </table>
</body>
</html>
<script type="text/javascript">
    function $(val){
        if(val.indexOf(0)=="#"){
            return document.getElementById(val);
        }else if(val.indexOf(0)=="."){
            return document.getElementsByClassName(val);
        }else{
            return document.getElementsByTagName(val);
        }
    }

    // 表头tr
    var TitleTr = $("thead")[0].lastElementChild;
    // 表内容
    var Tbody = $("tbody")[0];
    // 删除行开关
    var deleteTr = true;
    // 删除列开关
    var deleteTd = false;

    // var i = false;
    setInterval(function(){
        // 所有行
        var allTr = $("tr");
        // 最后一行的下标
        var lastTrIndex = allTr.length-1;
        // 最后一行
        var lastTr = allTr[lastTrIndex];
        // 最后一行的所有元素
        var lastAllTd = lastTr.children;

        // 循环最后一行中所有的td/th
        for(var a=0;a<lastAllTd.length;a++){
            // 如果其中有一个元素的子元素input有值,则创建行
            if(lastAllTd[a].lastElementChild.value != ""){
                // 创建一行
                let tr = document.createElement("tr");
                // 循环,判断创建的行要包括多少列
                for(var b=0;b<lastAllTd.length;b++){
                    // 创建input,创建td,追加到tr,追加到tbody
                    let input = document.createElement("input");
                    input.setAttribute("placeholder","请输入内容");

                    let td = document.createElement("td");
                    td.appendChild(input);

                    tr.appendChild(td)

                    Tbody.appendChild(tr);
                }

            }
        }

        // 循环每一行的最后一列
        for(var c=0;c<allTr.length;c++){
            // 如果每一行的最后一列中的input框不为空,创建列
            if(allTr[c].lastElementChild.lastElementChild.value != ""){
                // 循环所有行,以此来判断创建多少行的最后一列
                for(var d=0;d<allTr.length;d++){
                    if(d == 0){
                        // 创建input,创建td,追加到tr,追加到tbody
                        let input = document.createElement("input");
                        input.setAttribute("placeholder","请输入标题");

                        let th = document.createElement("th");
                        th.appendChild(input);

                        TitleTr.appendChild(th)
                    }else{
                        // 创建input,创建td,追加到tr,追加到tbody
                        let input = document.createElement("input");
                        input.setAttribute("placeholder","请输入内容");

                        let td = document.createElement("td");
                        td.appendChild(input);

                        allTr[d].appendChild(td)
                    }
                }

            }
        }

        // 判断是否要删除空行
        if(allTr[lastTrIndex-1]){
            // 倒数第二行的所有元素
            var lastPreAllTd = allTr[lastTrIndex-1].children;
            // 判断最后一行的前一行的元素是否为空
            for(var e=0;e<lastPreAllTd.length;e++){
                if(lastPreAllTd[e].lastElementChild.value != ""){
                    deleteTr = false;
                    break;
                }else{
                    deleteTr = true;
                }
            }
            // 如果倒数第二行为空,删除最后一行
            if(deleteTr){
                allTr[lastTrIndex].remove()
            }
        }

        // 判断是否要删除空列
        // 循环所有行
        for(var f=0;f<allTr.length;f++){
            // 循环每一行的倒数第二列
            if(allTr[f].children[allTr[f].children.length-2]){
                if(allTr[f].children[allTr[f].children.length-2].lastElementChild.value != ""){
                    deleteTd = false;
                    break;
                }else{
                    deleteTd = true;
                }
            }
        }
        // 如果判断是true,即可以删除空列
        if(deleteTd){
            // 循环所有行
            for(var g=0;g<allTr.length;g++){
                // 删除每一行的最后一列
                if(allTr[g].children[allTr[g].children.length-2]){
                    // 删除每一行的最后一列
                    allTr[g].children[allTr[g].children.length-1].remove();
                }
            }
        }

    }, 16)

</script>

效果图:

image

好了,以上就是动态实现行和列的方法和效果。

如有问题,请指出,接受批评。

个人微信公众号:

image

相关文章

网友评论

      本文标题:原生JS实现不固定行和列的表格

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