views:

122

answers:

4

I have a <div> element that contains a table, which I want to resize to the maximum viewport height - 70 px. The reason is that I want the header to stay in one place, and the table to scroll independantly. I can't use iframes for that, since there is complicated javascript interacting with the table. I therefore have to use a <div> and set it's overflow value to scroll. My problem is that the container wont resize when I tell it to. The container looks like this:

<div class="tableContainer" id="tblCont">
  <table width="100%" border="0" cellpadding="0" cellspacing="0" id="mainTbl" class="mainTable">
    <tr class="row_a" id="1">
      <td>id: 1</td>
    </tr>
  </table>
</div>

The CSS for my tableContainer class is as follow:

.tableContainer
{
    overflow: scroll;
    /*height: 400px;  -- this was just to see if the concept works - and this seems to work fine */
}

Lastly, here is the javascript that is supposed to set the height of the table container:

<script type="text/javascript">
    var tbc = document.getElementById("tblCont");
    var h = Math.round((window.innerHeight)-(70))+"px";
    tbc.style.height = h;
</script>

I even tried setting a fixed height with

tbc.style.height = "50px";

but that also does not work.

Any ideas?

A: 

I don't think the javascript gets excecuted. I wrapped it inside an init function and it works.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
     <title>Test</title>
        <style type="text/css">
      .tableContainer
      {
          overflow: scroll;
          /*height: 400px;  -- this was just to see if the concept works - and this seems to work fine */
      }
     </style>
     <script type="text/javascript">
      function init()
      {
          var tbc = document.getElementById("tblCont");
          var h = Math.round((window.innerHeight)-(70))+"px";

       document.getElementById('test').onclick = function()
       {
           tbc.style.width = "40px";
       }
      }

      window.onload = init;
     </script>
    </head>

    <body>
     <form>
      <input id="test" type="button" value="test" />
     </form>

     <div class="tableContainer" id="tblCont">
       <table width="100%" border="0" cellpadding="0" cellspacing="0" id="mainTbl" class="mainTable">
         <tr class="row_a" id="1">
           <td>id: 1</td>
         </tr>
       </table>
     </div>
    </body>
</html>
richard
No, it executes, but if you trace it through a debugger like firebug, you will see that it gets called before the div exists, and therefore fails with a "tbc is null" exception.
Jeff B
+3  A: 

Your script is being called before your DOM elements exist. You need to call your script with an onload event handler, and put your script in a function:

<script type="text/javascript">
    function setHeight() {
        var tbc = document.getElementById("tblCont");
        var h = Math.round((window.innerHeight)-(70))+"px";
        tbc.style.height = h;
    }
</script>

<body onload="setHeight()">
....
Jeff B
A: 

Try two things:

First, if you didn't already, comment out the var h line and then set the height manually:

<script type="text/javascript">
    var tbc = document.getElementById("tblCont");
    //var h = Math.round((window.innerHeight)-(70))+"px";
    tbc.style.height = "50px";
</script>

Second, try alerting out the h variable instead of setting the height:

<script type="text/javascript">
    var tbc = document.getElementById("tblCont");
    var h = Math.round((window.innerHeight)-(70))+"px";
    alert(h);
    //tbc.style.height = "50px";
</script>

My guess is that the problem is with how h is getting set, which is then killing anything after it.

Anthony
A: 

I would highly recommend you look at a third party Grid solution such as the Data Grid from the Dojo toolkit.
From experience, I can say that building a highly-functional data grid from scratch in DHTML is very difficult and making it cross browser compatible is just not fun.

Donal Boyle