tags:

views:

103

answers:

1

Why doesn't the following works? Don't tell me is cos table can't contain in a div...

<html>
<head>
    <script type="text/javascript">
    function addTable() {
        var table = document.createElement('table');
        table.innerHTML = "<tr><td>123</td><td>456</td></tr>";
        document.getElementById("addtable").appendChild(table);
    }
    </script>
</head>
<body>
    <input type="submit" value="New Table" onClick="addTable()"/>
    <div id="addtable"></div>
</body>
</html>
+4  A: 

To the best of my knowledge, setting the innerHTML property of a table element or table section element (like tbody or thead) does not work on Internet Explorer (EDIT: I just checked - with ietester and plain IE8. Result is "unknown runtime error" for IE6 and IE8, and it crashes IE7 but that might be an IEtester specific problem).

The DOM standard way of adding rows to a table is using the insertRow() method on a table or table section element (look for HTMLTableElement and HTMLTableSectionElement in that DOM spec) :

<script type="text/javascript">
function addTable() {
    var c, r, t;
    t = document.createElement('table');
    r = t.insertRow(0); 
    c = r.insertCell(0);
    c.innerHTML = 123;
    c = r.insertCell(1);
    c.innerHTML = 456;
    document.getElementById("addtable").appendChild(t);
}
</script>

In the script, there is no explicit table section being created. AFAIK, a TBODY is automatically created, and rows are inserted in there.

EDIT: regarding IE, I should point out that you can add a table with content and all by setting the innerHTML property, but the html you inject in there must be a complete table. So this does work, even on IE:

<script type="text/javascript">
function addTable() {
    var html = "<table><tr><td>123</td><td>456</td></tr></table>";
    document.getElementById("addtable").innerHTML = html;
}
</script>
Roland Bouman
Yes, Indeed, it throws runtime error! We should go by this method, or traditional create/append cycles for all tbody, tr and td.
Aviator
+1 Correct on all accounts. `innerHTML` is read-only for `table` and `tbody` in IE.
Justin Johnson
ya, tbody doesn't work in IE. But the code u gave also doesn't seem to work...
yeeen
my bad...typo. Change `table` to `t`. Fixed in the answer
Roland Bouman
Hi, i can't put sth like that inside?c.innerHTML = "<label for="name">Name:</label>";
yeeen
yeeen: put what inside what? AFAIK, you can set the innerHTML property of a table cell to whatever you like as long as it is valid HTML.
Roland Bouman
@Roland: i hv checked ur answer as the soln
yeeen