用js实现了表格数据管理的以下几个功能:
-
- 点击添加按钮可以添加一个空的可以修改的记录。
- 点击表格单元格可以修改文本。
- 修改后实现了保存的接口。
- 如果添加了新的记录而未做任何修改值都为null,保存全部时将被忽略。
- 保存全部时只保存修改过的值,原有的数据不再重复保存。
- 刷新时如果数据未保存则提示保存。
- 点击删除时如果是临时添加的无效数据则直接删除,如果保存过的记录则实现了记录删除的接口。
考虑到嵌套的比较多就没有使用form表单,用js直接解析dom来分离出了要传递的数据。
先看下运行的效果图:
js的代码如下,其中注释较多就不解释了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | var JCRUD= function (tb,colnum,saveAllBtn,add,ajaxSaver,allAjaxSaver,ajaxDeler){ var del = tb.getElementsByTagName( 'a' ); var span = tb.getElementsByTagName( 'span' ); var ctr=[]; /* 保存修改的tr对象 */ var delEvent = function (){ var dder = this .parentNode.parentNode; this .data=[]; for ( var i=0; i<dder.children.length-1; i++) this .data[i] = dder.children[i].children[0].firstChild.nodeValue; var tag = 0; for ( var j=0; j< this .data.length; j++){ if ( this .data[j]!== 'null' ){ /* 如果修改了单元格的默认值,这里也做相应修改 */ tag=1; break ; } } for ( var k=0; k<ctr.length; k++) if (ctr[k]===dder) ctr.splice(k,1); dder.parentNode.removeChild(dder); if (tag==1) ajaxDeler.call( this ); }; var spanEvent = function (){ /* 点击生成修改框 */ var value = this .firstChild.nodeValue; var input = document.createElement( 'input' ); input.value = value; this .parentNode.appendChild(input); this .parentNode.removeChild( this ); input.focus(); input.onblur = function (){ /* 失去焦点移除修改框 */ var span = document.createElement( 'span' ); span.appendChild(document.createTextNode( this .value? this .value: 'null' )); /* 如果修改了单元格的默认值,这里也做相应修改 */ span.onclick =spanEvent; this .parentNode.appendChild(span); this .parentNode.removeChild( this ); if (value!= this .value){ /* 如果内容改变生成保存按钮 */ var tr = span.parentNode.parentNode tds = tr.children; btns = tds[colnum-1].getElementsByTagName( 'a' ); for ( var i=0; i<btns.length; i++){ if (btns[i].firstChild.nodeValue!= '保存' ){ var saver = document.createElement( 'a' ); saver.href= "javascript:;" ; saver.appendChild(document.createTextNode( '保存' )); } else { var saver = btns[i]; } } tds[tds.length-1].appendChild(saver); var tag=0; for ( var k=0; k<ctr.length; k++) if (ctr[k]===tr) tag=1; if (tag==-0) ctr.push(tr); saver.onclick= function (){ /* 添加保存处理事件 */ this .data = []; for ( var i=0; i<tds.length-1; i++) this .data[i] = this .parentNode.parentNode.children[i].children[0].firstChild.nodeValue; ajaxSaver.call( this ); for ( var i=ctr.length-1; i>=0; i--){ if ( this .parentNode.parentNode===ctr[i]){ ctr.splice(i,1); } } this .parentNode.removeChild( this ); }; } } }; for ( var i in del) del[i].onclick = delEvent; /* 给现在有元素添加事件 */ for ( var j in span) span[j].onclick = spanEvent; add.onclick = function (){ var tbody = tb.children[0]; var tr = document.createElement( 'tr' ); for ( var j=0; j<colnum; j++){ var td = document.createElement( 'td' ); if (j==(colnum-1)){ var del = document.createElement( 'a' ); del.href= 'javascript:;' ; del.appendChild(document.createTextNode( '删除' )); del.onclick = delEvent; /* 给新加元素添加事件 */ td.appendChild(del); } else { var span = document.createElement( 'span' ); span.appendChild(document.createTextNode( 'null' )); /* 如果在添加时修改默认值,在这里修改的 */ td.appendChild(span); span.onclick =spanEvent; } tr.appendChild(td); } tbody.appendChild(tr); }; var getAllData = function (){ /* 保存全部的数据解析 */ var allData=[]; for ( var i=0; i<ctr.length; i++){ allData[i]=[]; for ( var j=0; j<ctr[i].children.length-1; j++) allData[i].push(ctr[i].children[j].children[0].firstChild.nodeValue); ctr[i].children[colnum-1].removeChild(ctr[i].children[colnum-1].children[1]); } ctr=[]; return allData; }; saveAllBtn.onclick = function (){ /* 添加保存全部数据保存事件 */ this .allData = getAllData(); if ( this .allData.length){ allAjaxSaver.call( this ); } else { alert( 'No data!' ); } }; window.onbeforeunload = function (){ /* 刷新提示保存数据 */ if (ctr.length){ var y = confirm( '数据还未保存,是否保存数据?' ) if (y){ saveAllBtn.click(); } } }; }; |
调用时要传几个参数,有几个参数为函数,每个参数都有注释,调用代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | window.onload = function (){ var table = document.getElementById( 'tb' ), /* 要操作的表格 */ colnum = 5, /* 这里修改表格的列数 */ saveAllBtn = document.getElementById( 'SaveAll' ), /* 保存全部的按钮 */ addBtn = document.getElementById( 'Add' ), /* 添加的按钮 */ saver = function (){ /* 此处可以加上ajax效果与数据库交互 data是个数组,需要可以改成JSON */ alert( '要传的数据为data数据:"' + this .data+ '"此处调用ajax实现后台保存!实现略……' ); }, allSaver = function (){ /* 此处可以加上ajax效果与数据库交互 data是个数组,需要可以改成JSON */ alert( '要传的数据为allDtat数组:"' + this .allData+ '"此处调用ajax实现后台保存!实现略……' ); }, deler = function (){ /* 此处可以加上ajax效果与数据库交互 data是个数组,需要可以改成JSON */ alert( '要传的数据为data数据:"' + this .data+ '"此处调用ajax实现后台删除!实现略……' ); }; window.JCRUD(table,colnum,saveAllBtn,addBtn,saver,allSaver,deler); }; |
可以看出saver、allSaver、deler都是需要自己实现的,这与后台的实现相关,与本例子也没有主要关系也就不实现了,只把要传的数据传过来供使用。
下面做了一个比较完整的例子,可以修改一下,实际看一下运行效果:
P.S.:转载请注明本文原始链接。
标签:
html
, javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?