项目中本来用的是ext做前台开发的,但是ext不好实现合并行,所以用jsp写了个动态合并的功能,效果如图: 现在的问题是我在输入车数的时候,比如:区域:一炼钢,渣类:D渣,对应了四个去向,输入4个1的时候,日累计车数自动计算,应该生成;,而一炼钢,1#滚筒渣 车数输入2的时候,日累计车数应该为2;但是因为jsp是通过循环得到的数据,然后根据名称相同的合并,任何字段只有一个ID,现在无法准备判断,我输入的哪几列的的车数,相加应该放到哪一列的日累计车数下。 问题我觉得有点难,希望有高手能帮忙解决下,非常感谢!顶者有分!现在分数最多只能给100分,多个论坛里都有,明天再加。希望大家能帮帮忙
项目中本来用的是ext做前台开发的,但是ext不好实现合并行,所以用jsp写了个动态合并的功能,效果如图: 现在的问题是我在输入车数的时候,比如:区域:一炼钢,渣类:D渣,对应了四个去向,输入4个1的时候,日累计车数自动计算,应该生成;,而一炼钢,1#滚筒渣 车数输入2的时候,日累计车数应该为2;但是因为jsp是通过循环得到的数据,然后根据名称相同的合并,任何字段只有一个ID,现在无法准备判断,我输入的哪几列的的车数,相加应该放到哪一列的日累计车数下。 问题我觉得有点难,希望有高手能帮忙解决下,非常感谢!顶者有分!现在分数最多只能给100分,多个论坛里都有,明天再加。希望大家能帮帮忙
<TABLE border="1" id="tab" width="500">
<TBODY>
<TR align="center">
<TD>A</TD>
<TD>B</TD>
<TD>C</TD>
<TD>D</TD>
<TD>E</TD>
<TD width="50">F</TD>
<TD width="50">G</TD>
</TR>
<TR align="center">
<TD rowspan="7">A1</TD>
<TD rowspan="4">B1</TD>
<TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
<TD><INPUT TYPE="text" size="3" name="d"></TD>
<TD>D2</TD>
<TD rowspan="4"> </TD>
<TD rowspan="4"> </TD>
</TR>
<TR align="center">
<TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
<TD><INPUT TYPE="text" size="3" name="d"></TD>
<TD>2</TD>
</TR>
<TR align="center">
<TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
<TD><INPUT TYPE="text" size="3" name="d"></TD>
<TD>2</TD>
</TR>
<TR align="center">
<TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
<TD><INPUT TYPE="text" size="3" name="d"></TD>
<TD>2</TD>
</TR>
<TR align="center">
<TD rowspan="2">B2</TD>
<TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
<TD><INPUT TYPE="text" size="3" name="d"></TD>
<TD>2</TD>
<TD rowspan="2"> </TD>
<TD rowspan="2"> </TD>
</TR>
<TR align="center">
<TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
<TD><INPUT TYPE="text" size="3" name="d"></TD>
<TD>2</TD>
</TR>
<TR align="center">
<TD>B3</TD>
<TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
<TD><INPUT TYPE="text" size="3" name="d"></TD>
<TD>2</TD>
<TD> </TD>
<TD> </TD>
</TR>
<TR align="center">
<TD>A2</TD>
<TD>B4</TD>
<TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
<TD><INPUT TYPE="text" size="3" name="d"></TD>
<TD>2</TD>
<TD> </TD>
<TD> </TD>
</TR>
</TBODY>
</TABLE><SCRIPT language=JavaScript>
var tab = document.getElementById("tab");
function count(inp){
var td = inp.parentElement;
var tr = inp.parentElement.parentElement;
for (var i=tr.rowIndex; i>0; i--) //从填写数值的行往表头方向查找
{
if (tab.rows[i].cells.length >= tab.rows(0).cells.length-1) //找到B栏显示的那一行(即有rowspan=""的td所在的tr)
{
var span,num = 0;
var inps = document.getElementsByName("c");
var dayTD = tab.rows[i].cells[tab.rows[i].cells.length - 2]; //因不能判定前方的列是否发生过合并,所以从后方向前找到合计单元格(倒数第2格)
if (tab.rows[i].cells.length == tab.rows(0).cells.length) //A栏未被合并,B栏为第2格
span = isNaN( parseInt( tab.rows[i].cells[1].rowSpan,10) ) ? 1 : parseInt( tab.rows[i].cells[1].rowSpan,10);
else //A栏被合并,B栏为第1格
span = isNaN( parseInt( tab.rows[i].cells[0].rowSpan,10) ) ? 1 : parseInt( tab.rows[i].cells[0].rowSpan,10);
//在input数组中相应范围内循环相加
for (var j=(i-1); j<(i+span-1); j++)
{
num += isNaN( parseInt(inps[j].value,10) ) ? 0 : parseInt(inps[j].value,10);
}
dayTD.innerHTML = num;
break;
}
}
}
</SCRIPT>
//用jQuery弄的.....快上班了...希望可以帮你
function t(event) {
var td = this;
var tr = $(td).parent();
while(tr.children().length <= 3) tr = tr.prev();
//此时的tr就是包含你要修改的区域的那个tr了
}
</script>
好强啊,刚运行了下你的代码,就是那种效果,不过,我这数据是动态的,table里面其实就是数据库查询出来一行一行的数据,只不过,用js把数据相同的合并了,所以你这边
var dayTD = tab.rows[i].cells[tab.rows[i].cells.length - 2]; //因不能判定前方的列是否发生过合并,所以从后方向前找到合计单元格(倒数第2格) 我现在根本就不能确定是哪一行,哪一列了。因为js代码是这样写的,将表的结构给打乱了。
<SCRIPT>
function uniteTable(thistab){
var rn=thistab.rows.length;//取得行数
var rowspann=0;
var j = 2;
var colcnt=new Array();
for(var k=0;k<rn;k++){
colcnt[k]=0;
}
for(i=rn-1;i>0;i--){//从倒数第一行开始往上检查
if(thistab.rows[i].cells[j].childNodes[0].data==thistab.rows[i-1].cells[j].childNodes[0].data&&thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
{//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。
rowspann+=thistab.rows[i].cells[j].rowSpan;
colcnt[i]++;
thistab.rows[i].deleteCell(j);
}else {
thistab.rows[i].cells[j].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
rowspann=0;
}
}
}
uniteTable(document.getElementById("table1"));
</SCRIPT>这是合并第一列,如何第二列,第三列,只是需要改一下var j = "" 就可以了
我在web开发里也发了一个,3楼的思路我觉得还挺适合,不过,现在有个小问题,希望大家能帮忙看看http://topic.csdn.net/u/20100527/16/ee1fc2a7-3bb2-4bf9-ad23-c4e13dbaa3ce.html
这段代码貌似没啥影响,3楼的代码就是应对表结构被破坏之后的情况
需要填写合计的是倒数第n列,var dayTD = tab.rows[i].cells[tab.rows[i].cells.length - n]; 就可以了
LZ可以试试,我觉得应该没影响
刚才还是论坛维护中,现在又好了……
HTML部分<table width="100%" height="100%" border="0" cellpadding="0"
cellspacing="0" class="table_main">
<tr>
<td valign="top">
<table width="100%" border="0" cellspacing="1" cellpadding="1">
<tr>
<td>
<div id="advancedSearch" style="visible: yes">
<table width="100%" border="0" cellspacing="1" cellpadding="1"
class="table_search">
<tr>
<td align="left">
<form name="form1" method="post" action="">
<table border="0" width="100%" align="left" cellpadding="0"
cellspacing="0" class="content12">
<tr>
<td align="right">
统计日期
</td>
<td align="left">
<div id="statisticDateDiv"></div></td>
<td>
<input id="baseSaveBtn" type="button" value="保 存"
class="button2" onclick="saveBasicInfo()">
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</div>
</td>
</tr><tr>
<td>
<div id="gridDiv"
style="visible: yes; overflow: auto; height: 400px">
<table width="100%" border="1" cellspacing="1" cellpadding="1"id="table1">
<form id="myform" name="myform">
<tr>
<td colspan="4">
<input name="add" type="button" class="button2"
onClick="addBaseInfo();" value="添 加">
<input name="del" type="button" class="button2"
onClick="delBaseInfo(document.myform.trZhaRegionPlaceId);"
value="删 除">
</td>
</tr>
<tr bgcolor=skyblue height=25 align="center">
<td>
<input type="checkbox"
onClick="cc(document.myform.trZhaRegionPlaceId)">
</td>
<td>序号</td><td>区域</td><td>渣类</td><td>车数</td><td>吨位</td><td>去向</td><td>是否出厂</td><td>日累计车数</td><td>日累计吨位</td><td>总计车数</td><td>总计吨位</td>
</tr><tr class="table_c1">
<td>
<input type="checkbox" value="618"
id="trZhaRegionPlaceId" name="trZhaRegionPlaceId">
</td>
<td>1</td>
<td>一炼钢</td>
<td>D渣</td>
<td>
<input type="text" name="carQty" id="carQty" size="8" onchange="count(this)" onkeydown="pre=this.value" value="">
</td>
<td>
<input type="text" name="tonnage" id="tonnage" size="8" onblur="doCheck2(this)" value="">
</td>
<td>
<input type="hidden" id="placeName" name="placeName"
value="闷罐">
闷罐
</td>
<td>
<input type="checkbox" id="isProduce" name="isProduce"
checked="checked">
</td>
<td>
<div id="614615"></div>
</td>
<td>
<div id="oneTonnage"></div>
</td>
<td>
<div id="sumCarQty"></div>
</td>
<td>
<div id="sumTonnage"></div>
</td>
</tr><tr class="table_c1">
<td>
<input type="checkbox" value="620"
id="trZhaRegionPlaceId" name="trZhaRegionPlaceId">
</td>
<td>2</td>
<td>一炼钢</td>
<td>D渣</td>
<td>
<input type="text" name="carQty" id="carQty" size="8" onchange="count(this)" onkeydown="pre=this.value" value="">
</td>
<td>
<input type="text" name="tonnage" id="tonnage" size="8" onblur="doCheck2(this)" value="">
</td>
<td>
<input type="hidden" id="placeName" name="placeName"
value="灰池">
灰池
</td>
<td>
<input type="checkbox" id="isProduce" name="isProduce">
</td>
<td>
<div id="614615"></div>
</td>
<td>
<div id="oneTonnage"></div>
</td>
<td>
<div id="sumCarQty"></div>
</td>
<td>
<div id="sumTonnage"></div>
</td>
</tr><tr class="table_c1">
<td>
<input type="checkbox" value="622"
id="trZhaRegionPlaceId" name="trZhaRegionPlaceId">
</td>
<td>3</td>
<td>一炼钢</td>
<td>D渣</td>
<td>
<input type="text" name="carQty" id="carQty" size="8"
onchange="count(this)" onkeydown="pre=this.value" value="">
</td>
<td>
<input type="text" name="tonnage" id="tonnage" size="8"
onblur="doCheck2(this)" value="">
</td>
<td>
<input type="hidden" id="placeName" name="placeName"
value="出厂">
出厂
</td>
<td>
<input type="checkbox" id="isProduce" name="isProduce">
</td>
<td>
<div id="614615"></div>
</td>
<td>
<div id="oneTonnage"></div>
</td>
<td>
<div id="sumCarQty"></div>
</td>
<td>
<div id="sumTonnage"></div>
</td>
</tr>
<tr class="table_c1">
<td>
<input type="checkbox" value="624"
id="trZhaRegionPlaceId" name="trZhaRegionPlaceId">
</td>
<td>4</td>
<td>一炼钢</td>
<td>D渣</td>
<td>
<input type="text" name="carQty" id="carQty" size="8"
onchange="count(this)" onkeydown="pre=this.value" value="">
</td>
<td>
<input type="text" name="tonnage" id="tonnage" size="8"
onblur="doCheck2(this)" value="">
</td>
<td>
<input type="hidden" id="placeName" name="placeName"
value="开发">
开发
</td>
<td>
<input type="checkbox" id="isProduce" name="isProduce">
</td>
<td>
<div id="614615"></div>
</td>
<td>
<div id="oneTonnage"></div>
</td>
<td>
<div id="sumCarQty"></div>
</td>
<td>
<div id="sumTonnage"></div>
</td>
</tr>
</form>
</table></div>
</td>
</tr>
</table>
</td>
</tr>
</table>
/*因报错,所以注掉了
var parentWin = window.parent;
var scrollTop = document.body.scrollTop;
var scrollLeft = document.body.scrollLeft;
if (parentWin.grid_.operatorType==1){
clearValues();
} else if (parentWin.grid_.operatorType==2){
setValues();
}
function clearValues(){
$("statisticDate").disabled= false;
$("statisticDate").value = "<%=date%>";
}
function setValues(){
var m = parentWin.grid_.getSelectionModel().getSelections();
$("statisticDate").disabled= true;
$("statisticDate").value = m[0].get("statisticDate");
}
//复选框全选或是反选功能
function cc(oj) {
for (var i=0;i<oj.length;i++ ) {
if (oj[i].checked)
{
oj[i].checked=false;
} else
{
oj[i].checked=true;
}
}
}
*/
</script>
<SCRIPT type="text/javascript">
function uniteTable5(thistab){
var rn=thistab.rows.length;//取得行数
var rowspann=0;
var j = 2;
var m = 11;
var colcnt=new Array();
for(var k=0;k<rn;k++){
colcnt[k]=0;
}
for(i=rn-1;i>1;i--){//从倒数第一行开始往上检查
if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
{//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。
rowspann+=thistab.rows[i].cells[m].rowSpan;
colcnt[i]++;
thistab.rows[i].deleteCell(m);
}else {
thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
rowspann=0;
}
}
}
uniteTable5(document.getElementById("table1"));
</SCRIPT>
<SCRIPT>
function uniteTable4(thistab){
var rn=thistab.rows.length;//取得行数
var rowspann=0;
var j = 2;
var m = 10;
var colcnt=new Array();
for(var k=0;k<rn;k++){
colcnt[k]=0;
}
for(i=rn-1;i>1;i--){//从倒数第一行开始往上检查
if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
{//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。
rowspann+=thistab.rows[i].cells[m].rowSpan;
colcnt[i]++;
thistab.rows[i].deleteCell(m);
}else {
thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
rowspann=0;
}
}
}
uniteTable4(document.getElementById("table1"));
</SCRIPT>
<SCRIPT>
function uniteTable3(thistab,colLength){
var rn=thistab.rows.length;//取得行数
// alert("当前共有"+rn)
var rowspann=0;
var j = 3;
var m = 9;
var colcnt=new Array();
for(var k=0;k<rn;k++) {
colcnt[k]=0;
}
for(i=rn-1;i>1;i--) {//从倒数第一行开始往上检查
if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
{//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。
rowspann+=thistab.rows[i].cells[m].rowSpan;
colcnt[i]++;
thistab.rows[i].deleteCell(m);
}else {
thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
rowspann=0;
}
}
}
uniteTable3(document.getElementById("table1"));
</SCRIPT>
<SCRIPT>
function uniteTable2(thistab){
var rn=thistab.rows.length;//取得行数
// alert("当前共有"+rn)
var rowspann=0;
var j = 3;
var m = 8;
var colcnt=new Array();
for(var k=0;k<rn;k++) {
colcnt[k]=0;
}
for(i=rn-1;i>1;i--) {//从倒数第一行开始往上检查
if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
{//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。
rowspann+=thistab.rows[i].cells[m].rowSpan;
colcnt[i]++;
thistab.rows[i].deleteCell(m);
}else {
thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
rowspann=0;
}
}
}
uniteTable2(document.getElementById("table1"));
</SCRIPT>
<SCRIPT>
function uniteTable1(thistab){
var rn=thistab.rows.length;//取得行数
// alert("当前共有"+rn)
var rowspann=0;
var j = 3;
var colcnt=new Array();
for(var k=0;k<rn;k++) {
colcnt[k]=0;
}
for(i=rn-1;i>1;i--) {//从倒数第一行开始往上检查
if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
{//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。
rowspann+=thistab.rows[i].cells[j].rowSpan;
colcnt[i]++;
thistab.rows[i].deleteCell(j);
}else {
thistab.rows[i].cells[j].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
rowspann=0;
}
}
}
uniteTable1(document.getElementById("table1"));
</SCRIPT>
<SCRIPT>
function uniteTable(thistab){
var rn=thistab.rows.length;//取得行数
var rowspann=0;
var j = 2;
var colcnt=new Array();
for(var k=0;k<rn;k++){
colcnt[k]=0;
}
for(i=rn-1;i>1;i--){//从倒数第一行开始往上检查
if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
{//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。
rowspann+=thistab.rows[i].cells[j].rowSpan;
colcnt[i]++;
thistab.rows[i].deleteCell(j);
}else {
thistab.rows[i].cells[j].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
rowspann=0;
}
}
}
uniteTable(document.getElementById("table1"));
</SCRIPT>
<SCRIPT language=JavaScript>
var tab = document.getElementById("table1");
var pre;
function count(inp){
var td = inp.parentElement;
var tr = inp.parentElement.parentElement;
for (var i=tr.rowIndex; i>1; i--) //从填写数值的行往表头方向查找
{
if (tab.rows[i].cells.length >= tab.rows(1).cells.length-5) //找到B栏显示的那一行(即有rowspan=""的td所在的tr)
{
var dayTD = tab.rows[i].cells[tab.rows[i].cells.length - 4]; //因不能判定前方的列是否发生过合并,所以从后方向前找到合计单元格(倒数第4格)
pre = isNaN(parseInt(pre,10) ) ? 0 : parseInt(pre,10);
var oldT = isNaN( parseInt(dayTD.innerHTML,10) ) ? 0 : parseInt(dayTD.innerHTML,10);
var num = isNaN( parseInt(inp.value,10) ) ? 0 : parseInt(inp.value,10);
//alert(oldT+" + "+num+" - "+pre)
dayTD.innerHTML = oldT + num - pre;
break;
}
}
}
</SCRIPT>
谢谢zyzy15,你的找个方法,我试了下,也可以,好强啊!现在问题也解决了,谢谢各位朋友了!