Reputation: 10049
I was learning about appendChild
and have so far come up with this code:
var blah = "Blah!";
var t = document.createElement("table"),
tb = document.createElement("tbody"),
tr = document.createElement("tr"),
td = document.createElement("td");
t.style.width = "100%";
t.style.borderCollapse = 'collapse';
td.appendChild(document.createTextNode(blah));
// note the reverse order of adding child
tr.appendChild(td);
tb.appendChild(tr);
t.appendChild(tb);
document.getElementById("theBlah").appendChild(t);
<div id="theBlah">d</div>
But that gives me an error saying Uncaught TypeError: Cannot call method 'appendChild' of null
. What am I doing wrong?
Upvotes: 7
Views: 67306
Reputation: 59
I believe you can just link your JavaScript to your html using the defer attribute.
<script src="script.js" defer></script>
This way your JavaScript will not run until after the page has loaded.
Upvotes: 1
Reputation: 16706
proper way (rows & cols & the random innerText is set dynamically ...by you)
this way is probably not the shortest but by way the fastest to build a table.
It’s also a full table with thead
and filled with random text:
use native JavaScript (not slowing down JQuery)
(function(){})()
executes the code before body is loading
doesn’t have problems with other variables outside the function
and pass the document so you have shorter variables
there is a way to shorten the function by using clone node... but it’s slower and maybe not supported by all browsers
use createDocumentFragment()
to create the tr
’s. If you have a lot of rows this helps to build the DOM faster.
(function (d) {
var rows = 10,
cols = 3,
t = d.createElement('table'),
the = d.createElement('thead'),
tb = d.createElement('tbody'),
tr = d.createElement('tr');
t.style.width = "100%";
t.style.borderCollapse = 'collapse';
for (var a = 0; a < cols; a++) {
var th = d.createElement('th');
th.innerText = Math.round(Math.random() * 100);
tr.appendChild(th);
};
the.appendChild(tr);
var f = d.createDocumentFragment();
for (var a = 0; a < rows; a++) {
var tr = d.createElement('tr');
for (var b = 0; b < cols; b++) {
var td = d.createElement('td');
td.innerText = Math.round(Math.random() * 100);
tr.appendChild(td);
}
f.appendChild(tr);
}
tb.appendChild(f);
t.appendChild(the);
t.appendChild(tb);
window.onload = function () {
d.body.appendChild(t)
};
})(document)
Upvotes: 2
Reputation: 34053
The script is being run before the page completes loading. Which is why document.getElementById("theBlah") returns null.
Either use something like jQuery or simply something like
<script>
window.onload = function () {
var blah="Blah!";
var t = document.createElement("table"),
tb = document.createElement("tbody"),
...
//the rest of your code here
};
</script>
Upvotes: 11
Reputation: 392
Do yourself and us a favor and use JQuery. Everything becomes much simpler.
$('div.SomeDiv').append($('<table></table>').css('width','100%').append($('<tbody></tbody>').append($('<tr></tr>').append($('<td></td>').html("Blah Text"))))); // Everything else you want to add here...
Upvotes: -2
Reputation: 78840
The problem is that document.getElementById("theBlah")
returns null. The reason why is that your code is running before the theBlah
element has been created. You should place your code in an onload
event handler.
Upvotes: 7
Reputation: 736
Try wrapping your JavaScript in an onload function. So first add:
<body onload="load()">
Then put your javascript in the load function, so:
function load() {
var blah="Blah!";
var t = document.createElement("table"),
tb = document.createElement("tbody"),
tr = document.createElement("tr"),
td = document.createElement("td");
t.style.width = "100%";
t.style.borderCollapse = 'collapse';
td.appendChild(document.createTextNode(blah));
// note the reverse order of adding child
tr.appendChild(td);
tb.appendChild(tr);
t.appendChild(tb);
document.getElementById("theBlah").appendChild(t);
}
Upvotes: 23