企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在做调查问卷的过程中,遇到一个表格的统计问题,算是需要些js方面的综合知识,所以记录下来。 基本需求如下: ![](https://box.kancloud.cn/2016-02-18_56c556cbf1078.jpg) 核心的htm如下: ~~~ <div class="tablebox"> <h2> <span>(3)2010年市属疾病预防控制中心信息化建设资金来源及分配情况</span></h2> <div class="blockB"> <p> 说明:单位:万元,精确到小数点后1位</p> </div> <ul> <li> <table border="0" cellspacing="0" cellpadding="0" class="templateTable" width="750px"> <tr> <td class="tdright" colspan="2"> </td> <td class="tdcol"> 政府财政</td> <!--<td class="tdcol"> 项目经费</td>--> <td class="tdcol"> 单位自筹</td> <td class="tdcol"> 其他资金</td> <td class="tdcol"> 合计</td> </tr> <tr> <td class="tdright width20" rowspan="4">直接支出</td> <td class="tdright"> 软件</td> <td class="tdleft"> <input name="text_4780" type="text" id="text_4780" class="width110 digital" /></td> <td class="tdleft"> <input name="text_4782" type="text" id="text_4782" class="width110 digital" /></td> <td class="tdleft"> 金额:<input name="text_4783" type="text" id="text_4783" class="width90 digital" /> 来源:<input type="text" name="text_4784" id="text_4784" class="width90" /></td> <td class="tdleft"> <input type="text" class="width110" id='82row1' disabled="disabled" /> </td> </tr> <tr> <td class="tdright"> 硬件</td> <td class="tdleft"> <input name="text_4785" type="text" id="text_4785" class="width110 digital" /></td> <td class="tdleft"> <input name="text_4787" type="text" id="text_4787" class="width110 digital" /></td> <td class="tdleft"> 金额:<input name="text_4788" type="text" id="text_4788" class="width90 digital" /> 来源:<input type="text" name="text_4789" id="text_4789" class="width90" /></td> <td class="tdleft"> <input type="text" id="82row2" class="width110" disabled="disabled" /></td> </tr> <tr> <td class="tdright"> 运行维护</td> <td class="tdleft"> <input name="text_4790" type="text" id="text_4790" class="width110 digital" /></td> <td class="tdleft"> <input name="text_4792" type="text" id="text_4792" class="width110 digital" /></td> <td class="tdleft"> 金额:<input name="text_4793" type="text" id="text_4793" class="width90 digital" /> 来源:<input type="text" name="text_4794" id="text_4794" class="width90" /></td> <td class="tdleft"> <input type="text" id="82row3" class="width110" disabled="disabled" /></td> </tr> <tr> <td class="tdright"> 其他投入</td> <td class="tdleft"> <input name="text_4795" type="text" id="text_4795" class="width110 digital" /></td> <td class="tdleft"> <input name="text_4797" type="text" id="text_4797" class="width110 digital" /></td> <td class="tdleft"> 金额:<input name="text_4798" type="text" id="text_4798" class="width90 digital" /> 来源:<input type="text" name="text_4799" id="text_4799" class="width90" /></td> <td class="tdleft"> <input type="text" id="82row4" class="width110" disabled="disabled" /></td> </tr> <tr> <td class="tdright" colspan="2"> 经费下拨</td> <td class="tdleft"> <input name="text_6362" type="text" id="text_6362" class="digital width110" /></td> <td class="tdleft"> <input name="text_6363" type="text" id="text_6363" class="digital width110" /></td> <td class="tdleft"> 金额:<input name="text_6364" type="text" id="text_6364" class="digital width90" /> 来源:<input name="text_6365" type="text" id="text_6365" class="width90" /></td> <td class="tdleft"> <input type="text" id="82row5" class="width110" disabled="disabled" /></td> </tr> <tr> <td class="tdright" colspan="2"> 合计</td> <td class="tdleft"> <input type="text" id="82col1" title1="surveyTable" disabled="disabled" /></td> <td class="tdleft"> <input type="text" id="82col3" title1="surveyTable" disabled="disabled" /></td> <td class="tdleft"> <input type="text" id="82col4" title1="surveyTable" disabled="disabled" /></td> <td class="tdleft"> <input type="text" id="82sum" title1="surveyTable" disabled="disabled" /></td> </tr> </table> </li> </ul> </div> ~~~ 看到这样的基本需求,本身并不难,基本思路就是在更新数据后,失去了焦点的同时,更新对应的合计文本框。难点在于获取需要累加那些文本框的值。 1如果只知道合计的文本框ID如何得到需要累加的文本框编号呢? 先分析行统计,可以发现,行统计需要的文本框和合计的文本框都在同一个tr标签中,而且都有类digital。例如82row1需要计算的文本框text_4780,text_4782,text_4783 都在同一个tr标签中,而且类都有digital(这样就可以排除不需要统计的文本框text_4784)。 所以基本的思路就是根据这个关系去寻找需要统计的文本框,例如对于82row1就需要找到文本框text_4780,text_4782,text_4783。 经过测试的基本js代码如下: ~~~ function GetOneRowAllChild(totalId) { var idList = []; var tdList=$("#"+totalId).parent('td').parent().children("td");//取统计文本框的父节点td的父节点tr,然后再取tr的子节点,得到同一行的所有td $.each(tdList, function(i, n){//循环td var inputs=$(n).children("input[type='text']");//得到td中的文本框 if(inputs.length>0) { $.each(inputs, function(j, itemInput){ //循环td中的文本框 var item=$(itemInput); if(item.hasClass("digital"))//判断是不是需要的文本框,排除来源列的文本款 { var id=item.attr("id"); idList.push(id); } }); } }); //var NameList = idList.join(","); //alert(NameList); BindBlur(idList,totalId); } function BindBlur(idList,totalId)//绑定失去焦点的事件blur { $.each(idList, function(j, item){ var id=item; $("#"+id).blur( function () { updateSum(idList,totalId) } ); }); } function updateSum(idList,totalId)//更新统计值 { var sum=0.0; $.each(idList, function(j, item){ var id=item; var value=$("#"+id).val(); if($.isNumeric(value)) { sum+=parseFloat(value); } }); $("#"+totalId).val(sum); } ~~~ 2有了获取每一行的的文本框的思路后,在考虑每一列的思路,和获取每一行的思路基本相同,但在修改的过程中,发现还是有很多不同。 经过测试的代码如下 ~~~ function GetOneColumnAllChild(totalId,index) { var idList = []; var trList=$("#"+totalId).parent('td').parent('tr').parent().children("tr");////取统计文本框的父节点td的父节点tr的父节点table,然后再取table的子节点,得到所有tr $.each(trList, function(i, n){ //遍历所有的tr var tdList=$(n).children("td") // if(tdList.length>0) { var inputindex=0; $.each(tdList, function(j, item){ //遍历所有的td // if(j==index)// 由于<td class="tdright width20" rowspan="4">直接支出</td>,导致如果这样取数据会出错,因为第一行多了一个td,其他含都比第一行少了一个td // { var inputList=$(item).children("input[type='text']"); if(inputList.length>0) { $.each(inputList, function(k, iteminput){ //遍历所有的文本框 var item=$(iteminput); if(item.hasClass("digital")){ inputindex++; if(inputindex==index){ //支取指定列的文本框 idList.push(item.attr("id")); } } });//end inputList }// end if(inputList.length>0) });// end tdList } // if(tdList.length>0) });//end trList BindBlur(idList,totalId); //var NameList = idList.join(","); //alert(NameList); } ~~~ 总结:初次遇见此类问题,真的没有什么比较好的思路。这样虽然初步算是解决了,但灵活性很小,例如每一个单元格只能有一个需要统计的文本框,多个就会出错。不过根据现在最简单如果进行扩展,就会适应更复杂的情况。