Javascript实现可编辑表格应用

Javascript实现可编辑表格应用

题目要求:
  • 实现一个可编辑表格,双击时可编辑部分单元格中内容。
  • 修改单科成绩内容后,自动修改后面总分成绩。
  • 如果输入内容有误,需要强制重新输入。
思路:

框架部分:表格形式由于结构大致是相同的,所以考虑动态生成数据来构建。

css部分:根据题目示例要求来进行修饰

JS部分:

  • 双击事件
  • 事件函数
    • 点击后创建一个input元素。定义input框中的初始内容为原单元格内容。并且清空原单元格内容。
    • 创建焦点离开事件,当鼠标点击输入框外的其他地方时实现获取当前输入的值进行条件判断。满足条件返回新值;不满足条件返回原值,并弹出提示框。
具体实现:
var fromContent = [
                             {学号: "1101",姓名: "小王",语文: 98,数学: 80,英语: 91,总分:"269"}, 
                             {学号: "1102",姓名: "小曾",语文: 88,数学: 87,英语: 92,总分:"267"},
                             {学号: "1103",姓名: "小赵",语文: 76,数学: 90,英语: 86,总分:"252"},
                             {学号: "1104",姓名: "小周",语文: 65,数学: 81,英语: 83,总分:"229"}
                          ];
        console.log(fromContent);
        for(var i = 0;i<fromContent.length;i++){
            var Id = fromContent[i].学号;
            var name = fromContent[i].姓名;
            var chinese = fromContent[i].语文;
            var math = fromContent[i].数学;
            var english = fromContent[i].英语;
            var sum = fromContent[i].总分;
            console.log(Id,name,chinese,math,english,sum);
            var newItem=document.createElement("tr");
            newItem.innerHTML = `
            <td>${Id}</td>
            <td>${name}</td>
            <td ondblclick="Change(this)" ${i}>${chinese}</td>
            <td ondblclick="Change(this)" ${i}>${math}</td>
            <td ondblclick="Change(this)" ${i}>${english}</td>
            <td id="sum`+i+`">${sum}</td>`;
            newItem.id=i;
            var list=document.getElementById("myList");
	        list.appendChild(newItem);  //父节点下的子节点后添加节点
        }

该部分为动态生成数据部分。创建一个数组。对数组进行遍历,在通过模板字符串的方法插入内容在新创建的子节点中。即完成动态数据的创建。此处注意的点是每创建一个子元素tr是都要对她进行id赋值(id的值即数组的索引值)。方便后面取数时对数组的遍历。

function Change(element){
            //获取当前节点内容
            var valueText = element.innerHTML;
            //创建input元素
            var newnode = document.createElement("input");
            // 设置input类型
            newnode.type = "text";
            // 设置value
            newnode.value = valueText;
            //设置该标签的子节点为空
            element.innerHTML = '';
            //添加该标签的子节点,input对象
            element.appendChild(newnode);
            // 光标离开事件
            newnode.onblur=function(){
                // 修改后内容
                var num = this.value
                if(this.value>=0&&this.value<=100){
                    // 光标离开时,判断修改内容是否相同
                    element.innerHTML = num==valueText?valueText:num;
                    var index = element.parentNode.id;
                    var newsum = (num-valueText)+parseInt(fromContent[index].总分);
                    document.getElementById("sum"+index).innerHTML = newsum;
                }else{
                    element.innerHTML =valueText;
                    alert("请输入0-100的数字");
                }
            }
            //设置获得光标
            newnode.focus();
        }
完整代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            font-family: 微软细黑;
        }
        #app{
            width: 700px;
            height: 300px;
            /* border: steelblue 1px solid; */
            margin: 0 auto;
        }
        table,tr,th,td{
            border: darkgray 2px solid;
            text-align: center;
        }
        table{
            width: 100%;
            height: 60%;
            margin-top: 8%;
            border-collapse: collapse;
        }
        h2{
            font-weight: normal;
            text-align: center;
            margin-top: 4%;
        }
        th{
            background-color: rgba(216, 213, 213, 0.973);
        }
        th,td{
            width: 116.6px;
            height: 40px;
        }
        input{
            width: 95%;
            height: 90%;
            border-radius: 5px;
            font-size: 16px;
            border: rgb(93, 93, 94) 2px solid;
            /* background-color: rgb(221, 223, 226); */
        }
    </style>
</head>

<body>
    <div id="app">
        <h2>可编辑表格</h2>
        <table id="myList">
            <tr>
                <th>学号</th>
                <th>姓名</th>
                <th>语文</th>
                <th>数学</th>
                <th>英语</th>
                <th>总分</th>
            </tr>
        </table>
    </div>

    <script>
        var fromContent = [
                             {学号: "1101",姓名: "小王",语文: 98,数学: 80,英语: 91,总分:"269"}, 
                             {学号: "1102",姓名: "小曾",语文: 88,数学: 87,英语: 92,总分:"267"},
                             {学号: "1103",姓名: "小赵",语文: 76,数学: 90,英语: 86,总分:"252"},
                             {学号: "1104",姓名: "小周",语文: 65,数学: 81,英语: 83,总分:"229"}
                          ];
        console.log(fromContent);
        for(var i = 0;i<fromContent.length;i++){
            var Id = fromContent[i].学号;
            var name = fromContent[i].姓名;
            var chinese = fromContent[i].语文;
            var math = fromContent[i].数学;
            var english = fromContent[i].英语;
            var sum = fromContent[i].总分;
            console.log(Id,name,chinese,math,english,sum);
            var newItem=document.createElement("tr");
            newItem.innerHTML = `
            <td>${Id}</td>
            <td>${name}</td>
            <td ondblclick="Change(this)" ${i}>${chinese}</td>
            <td ondblclick="Change(this)" ${i}>${math}</td>
            <td ondblclick="Change(this)" ${i}>${english}</td>
            <td id="sum`+i+`">${sum}</td>`;
            newItem.id=i;
            var list=document.getElementById("myList");
	        list.appendChild(newItem);  //父节点下的子节点后添加节点
        }
        function Change(element){
            //获取当前节点内容
            var valueText = element.innerHTML;
            //创建input元素
            var newnode = document.createElement("input");
            // 设置input类型
            newnode.type = "text";
            // 设置value
            newnode.value = valueText;
            //设置该标签的子节点为空
            element.innerHTML = '';
            //添加该标签的子节点,input对象
            element.appendChild(newnode);
            // 光标离开事件
            newnode.onblur=function(){
                // 修改后内容
                var num = this.value
                if(this.value>=0&&this.value<=100){
                    // 光标离开时,判断修改内容是否相同
                    element.innerHTML = num==valueText?valueText:num;
                    var index = element.parentNode.id;
                    var newsum = (num-valueText)+parseInt(fromContent[index].总分);
                    document.getElementById("sum"+index).innerHTML = newsum;
                }else{
                    element.innerHTML =valueText;
                    alert("请输入0-100的数字");
                }
            }
            //设置获得光标
            newnode.focus();
        }
    </script>
</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值