js综合应用简单的表格统计

在做调查问卷的过程中,遇到一个表格的统计问题,算是需要些js方面的综合知识,所以记录下来。

基本需求如下:

核心的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);
}

总结:初次遇见此类问题,真的没有什么比较好的思路。这样虽然初步算是解决了,但灵活性很小,例如每一个单元格只能有一个需要统计的文本框,多个就会出错。不过根据现在最简单如果进行扩展,就会适应更复杂的情况。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值