Wondering why I can't get document.getElementById("my_div").innerHTML
to update the DOM when I re-assign the variable. For example:
<div id="my_div" onclick="clicky();">
Bye.
</div>
<script type="text/javascript" charset="utf-8">
function clicky() {
var myDivValue = document.getElementById("my_div").innerHTML;
myDivValue = "Hello";
console.log(myDivValue);
}
</script>
In the log I can see the variable get re-assigned when I click, but the innerHTML of my_div remains unchanged. Why is this?
After several years more experience...
For those just starting out (like I was) and found yourself asking the same thing, there are two important concepts that need to be understood:
var myDivValue = element.innerHTML
would create a reference/address to innerHTML and every time I assigned a new value to that reference, I could just update content, but that's not how it works.element.innerHTML
value (which was blank) and assigning the value to myDivValue
, then in myDivValue = "Hello";
, I was assigning a new value to myDivValue
, so of course it would never update element.innerHTML
.The confusing part: when using the assignment operator (=
) in JS, it's not explicit that you're either assigning a reference or value (var referenceName = reference_to_thing
vs. var containerName = newValue
),
As many have said in the answers, the right way to do this is to assign the document.getElementById("my_div")
element to myDiv
:
var myDiv = document.getElementById("my_div")
And now that I have a reference to the element called myDiv
, I can update the innerHTML
property whenever I like:
myDiv.innerHTML = "Hello" // innerHTML is now "Hello"
myDiv.innerHTML = "Goodbye" // Changed it to "Goodbye"
innerHTML
evaluates to a string. I'm not sure why you would expect anything different. Consider this:
var a = 'foo'; // now a = 'foo'
var b = a; // now a = 'foo', b = 'foo'
b = 'bar'; // now a = 'foo', b = 'bar'
Re-assigning b
doesn't change a
.
Edited to add: In case it's not clear from the above, if you want to change innerHTML
, you can just assign to it directly:
document.getElementById("my_div").innerHTML = "Hello";
You don't need, and can't use, an intermediary variable.