最近在写后台开发的时候遇见一个小问题,可以说很苦恼了,主要是对前端开发不熟,尤其是DOM的操作还有动态绑定事件、提交操作,就是前端GET到一串JSON动态生成了一个table表,然后点击一个编辑按钮或者链接,解锁这一行,然后用户修改这一行,点击提交完成POST。功能很好描述,但是实际上要分为以下两步:
(1)选中哪一行就要把哪一行的tb里面加入input标签,然后input标签的value赋值原来的值
(2)点击提交后获取该行每一个input值,与数据库里的字段一一对应,然后提交
效果如图:
我操作这个table的时候耗费了很多脑细胞,而且现在再让我操作这样的表单提交,我都很恐惧,因为我写的代码真的很烧脑。我实现的思路是在table加入了一个ID,写了一个函数,当动态生成<td>的时候,给最右边的编辑<a>加上一个onlcik函数,只传一个值,传这是第几行,比如这是第二行changeToInputA(2)就是传2,然后这个函数,会用table的ID获取到整个table,一行行算table之后,定位到这一行,给这一行加入input,并把原来的“编辑”替换为“完成”,给完成<a>标签加上一个onlick函数,点击完成时,提交该行输入的内容,效果是可以实现,但是过程非常曲折,因为整个函数只获得了第几行的编号这一个值,然后table根据ID获取整个table才进行计算,非常艰辛了。
看代码吧:
/** * caeser * 20190409 */$(function(){ var getAddressOtUrl='/enterpriseportal/frontend/getaddressot';//分公司 var getAddressUrl='/enterpriseportal/frontend/getaddress?addid=';//主公司 var outHtml1='<tr><th>编号</th><th>名称</th><th>地址</th><th>联系人</th><th>电话</th><th>编辑</th></tr><tr>'; var outHtml2=''; $.getJSON(getAddressOtUrl,function(data){ var newsObj=data.addList; var numa=1; newsObj.map(function(item,data){ outHtml2+='<tr><td>'+numa+'</td><td>'+item.addName+'</td><td>'+item.addContent+'</td><td>'+item.addPhoneOwner+'</td><td>'+item.addPhoneNumber+'</td><td> <a href="#" onclick="changeToInput('+numa+')" >编辑</a></td></tr>'; numa++; });// $('#hr-part').html(outHtml1+outHtml2); $('#func-tab').html('<div class="blue"><div id="slatenav"><ul><li><a href="#" >新增地址</a></li></ul></div></div>'); }); })function changeToInput(id){ id=id+1; var ROW_NUM=4; var oneRow=document.getElementById('hr-part').rows[id].cells; var b=(id-2)*ROW_NUM+1; var updateAddressUrl='/enterpriseportal/addresscc/updateadress'; for(var a=0;a<oneRow.length-2;a++){ var inputHtmlLength='80px'; if((a+1)==2){ inputHtmlLength='230px'; } oneRow[a+1].innerHTML='<input value="'+oneRow[a+1].innerHTML+'" id="upTableRow'+(b++)+'" type="text">'; } oneRow[oneRow.length-1].innerHTML='<a href="#" id="finish'+id+'" >完成</a>'; document.getElementById('finish'+id).onclick=function(){ var fixNum=(id-2)*4+1; var formData=new FormData(); for(var d=1;d<5;d++){ var tmpC=document.getElementById('upTableRow'+fixNum).value; formData.append('inputC'+d,tmpC); fixNum++; } formData.append('id',id+2);//当前分公司地址前面还有三条信息 $.ajax({ url : updateAddressUrl, type : 'POST', data : formData, contentType : false, processData : false, cache : false, success : function(data) { self.location='/enterpriseportal/cps/joinusadmin'; } }); } } }
效果虽然实现了,我个人觉得不是很优雅规范,我会想办法改进的。