效果图:

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <!--<script type="text/javascript" src="js/index.js"></script>--> </head> <body> <center> <table id="tab" border="1"> <tr> <th width="25%">年级</th> <th width="25%">性别</th> <th width="25%">姓名</th> <th width="25%">操作</th> </tr> <tr> <td></td> <td></td> <td></td> <td> <button>编辑</button> <button>删除</button> </td> </tr> </table> <button id="but">添加</button> </center> </body> </html> <script> var but=null; //添加按钮 var tab=null; //表格 var n=0; //行标志 var dd = null; //定义一个变量 存所有的td var thLength = 0;//thLength是th标签的个数 window.onload = function(){ //初始化 tabInit(); //添加行 addRows(); } /* 功能:初始化按钮和表格对象 参数: 返回值: */ function tabInit(){ //添加按钮 点击调用addRows方法添加一行 but=document.getElementById("but"); but.addEventListener("click",addRows); //表格 用来追加行的 tab=document.getElementById("tab"); //添加表格的属性 宽度 边框 点击事件 tab.setAttribute("width","50%"); tab.setAttribute("border","1"); thLength = document.getElementsByTagName("th").length; } /* 功能:创建tr td 放到表格里面 参数: 返回值: */ function addRows(){ n++;//做标记删除按钮和行的关联标记 //创建tr 一会放到表格 var trdom=document.createElement("tr"); var tddom="";//创建td 一会放到tr里面 var czdom="";//创建删除按钮 一会放到一行最后一个td //thLength是th标签的个数 for(var i=0;i<thLength;i++){ tddom=document.createElement("td"); //最后一个单元格里面有一个删除按钮 if(i == thLength-1){ czdom=document.createElement("button"); czdom.innerHTML="删除"; //添加标识 和行相关联 64行 czdom.setAttribute("flage",n); //点击事件 czdom.addEventListener("click",del); //将按钮放到td里面 tddom.appendChild(czdom); //设置居中 同时用来判断是否添加单元格事件 tddom.style.textAlign="center"; } //将td 放到 tr 里面 trdom.appendChild(tddom); } //设置tr的属性和这一行的删除按钮相关联 52行 trdom.setAttribute("flage",n); //将ttr放到 tab里面 tab.appendChild(trdom); // ****************** // 给每个单元格添加事件 // ****************** //获取所有的td dd = document.getElementsByTagName("td"); //给所有的td加上点击事件 for(var j=0;j<dd.length;j++){ dd[j].addEventListener("click",addclick); } } /* 功能:td点击事件,将内容提换为文本框 参数: 返回值: */ function addclick(evt){ var tdObj = this;//被点击的那个td对象 var tdStr = "";//用来存td里面的内容 放到文本框中 //判断是最后一个td就结束方法 if(tdObj.style.textAlign != ""){ return; } //获取td里面的内容 将内容给文本框 tdStr = tdObj.innerHTML; tdObj.innerHTML = '<input type="text" value="'+tdStr+'" onBlur="xiaoshi(this)" style="border: none">'; // 设置当前操作的td属性 // 文本框时区焦点将文本框的值给td // 为了定位到正在操作的td tdObj.setAttribute("selTd","sel"); //删除事件 防止和文本框冲突 for(var l=0;l<dd.length;l++){ dd[l].removeEventListener('click',addclick); } } /* 功能:文本框失去焦点 文本框消失 参数: 文本框对象 返回值: */ function xiaoshi(obj){ //获取到文本框的内容 var val = obj.value; //将这个文本框删除 td清空 obj.remove(); //将文本框的内容给td 找到所有td dd = document.getElementsByTagName("td"); for(var i = 0; i<dd.length;i++){ //通过selTd 属性判断当前正在操作的td if(dd[i].getAttribute("selTd") == "sel"){ // 将文本框的内容给td dd[i].innerHTML = val; // 将 属性selTd 删除 保证唯一性 dd[i].removeAttribute("selTd"); } } //给所有的td加上点击事件 for(var j=0;j<dd.length;j++){ dd[j].addEventListener("click",addclick); } } /* 功能:点击删除将本行删除 参数: 返回值: */ function del(){ // var btnObj = this;//btnObj是删除按钮 对象 var num=btnObj.getAttribute("flage"); var trarr=document.getElementsByTagName("tr"); for(var a in trarr){ if(trarr[a].getAttribute("flage") == num){ trarr[a].remove(); } } } </script>