Re: Column order reversed when adding rows to a dynamic table
Available news archives: comp.lang.tcl - comp.lang.python - comp.security.firewalls - sci.crypt - comp.lang.php - comp.lang.javascript
Google
 
Web news.hping.org


comp.lang.javascript archive

Re: Column order reversed when adding rows to a dynamic table

From: RobG <rgqld@iinet.net.au>
Date: Tue Jan 24 2006 - 00:22:45 CET

dschectman@yahoo.com wrote:
> This appears to be a feature of IE JavaScript. I am running IE 6.0
> with the latest patches from Microsoft. Are there any workarounds
> other than re-coding the source HTML to place all the non-visible
> columns at the front?
>
> I have a page with a dynamic table. The table has some visible columns
> and some non-visible columns. The style "hide" is .hide {
> display:none; }
>
> <table id="SelectedList">
> <tr class="columnheader">
> <td>Value</td>
> <td class="hide">Code</td>
> <td class="hide">Type</td>
> </tr>
> </table>
>
> When I add rows to this table, the order of the columns depends on
> whether the hidden columns are at the beginning or end of the row.
> Here is the resulting HTML for the table. Note how in the second case,
> the order of the last two columns is reversed even though the function
> adds them in order: column1, column2, column3.

Yup, same result here. You can fix two ways: add the cells in one loop,
then hide them using a separate loop, or use createElement and add them
that way (see below):

>
> <TBODY>
> <TR class=columnheader>
> <TD class=hide>Code</TD>
> <TD class=hide>Type</TD>
> <TD class="">Value</TD></TR>
> <TR>
> <TD class=hide>column1</TD>
> <TD class=hide>column2</TD>
> <TD>column3</TD></TR>
> <TR>
> <TD>column1</TD>
> <TD class=hide>column3</TD>
> <TD class=hide>column2</TD></TR></TBODY>
>
> addItem('SelectedList');
> function addItem(gridID)
> {
> var grid = document.getElementById(gridID);
>
> // Test #1: first two columns hidden, las column visible
> var row1 = grid.insertRow(grid.rows.length);
> for (i=0;i<3;i++)
> {
> cell = row1.insertCell(i);
>
> if (i==0) cell.innerHTML = "column1"; //document.test.code.value;
> else if (i==1) cell.innerHTML = "column2";
> //document.test.categ.value;
> else cell.innerHTML = "column3"; //document.test.val.value;

The whole if..else bit can be replaced with:

     cell.appendChild(document.createTextNode("column" + (i+1)));

>
> if (i!=2) cell.className = "hide";
> }
>
> // Test #2: first column visible, last two hidden
> var row2 = grid.insertRow(grid.rows.length);

Replace from here:

> for (i=0;i<3;i++)
> {
> cell = row2.insertCell(i);
> if (i==0) cell.innerHTML = "column1"; //document.test.code.value;
> else if (i==1) cell.innerHTML = "column2";
> //document.test.categ.value;
> else cell.innerHTML = "column3"; //document.test.val.value;
>
> if (i!=0) cell.className = "hide";
> }

to here with either the following createElement solution:

   for (var i=0; i<3; i++)
   {
     cell = document.createElement('td');
     cell.appendChild(document.createTextNode("column" + (i+1)));
     row2.appendChild(cell);
     if (i!=0) cell.className = "hide";
   }

Or this 2 loop solution:

   for (var i=0; i<3; i++)
   {
     cell = row2.insertCell(i);
     cell.appendChild(document.createTextNode("column" + (i+1)));
   }

   for (var j=1, len=row2.length; j<len ; ++j){
     row2.cells[j].className = "hide";
   }

>
> //document.test.tblhtml.value = grid.innerHTML;
> alert(grid.innerHTML);
> }

-- 
Rob
Received on Tue Feb 7 21:19:57 2006